From cf3fe003e6472e73967afcd6675df99f996cd8c6 Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Sat, 23 Jul 2022 16:22:54 +0300 Subject: [PATCH] Move ownership of Session to Application The Session can be useful not only to the platform backend but also input backends and for things such as vt switching, etc. Therefore it's better to have the Application own the Session. --- autotests/integration/kwin_wayland_test.cpp | 2 ++ src/backends/drm/drm_backend.cpp | 28 +++++++++---------- src/backends/drm/drm_backend.h | 8 ++++-- src/backends/virtual/virtual_backend.cpp | 7 ----- src/backends/virtual/virtual_backend.h | 2 -- src/backends/wayland/wayland_backend.cpp | 7 ----- src/backends/wayland/wayland_backend.h | 2 -- .../standalone/x11_standalone_platform.cpp | 6 ---- .../x11/standalone/x11_standalone_platform.h | 2 -- .../x11/windowed/x11_windowed_backend.cpp | 7 ----- .../x11/windowed/x11_windowed_backend.h | 2 -- src/colors/colormanager.cpp | 3 +- src/input.cpp | 4 +-- src/main.cpp | 8 ++++++ src/main.h | 8 ++++++ src/main_wayland.cpp | 11 +++++++- src/main_x11.cpp | 2 ++ src/platform.h | 2 -- src/plugins/nightcolor/nightcolormanager.cpp | 2 +- src/utils/udev.cpp | 2 +- 20 files changed, 54 insertions(+), 61 deletions(-) diff --git a/autotests/integration/kwin_wayland_test.cpp b/autotests/integration/kwin_wayland_test.cpp index 77bf19939d..de4111aa7a 100644 --- a/autotests/integration/kwin_wayland_test.cpp +++ b/autotests/integration/kwin_wayland_test.cpp @@ -14,6 +14,7 @@ #include "inputmethod.h" #include "platform.h" #include "pluginmanager.h" +#include "session.h" #include "utils/xcbutils.h" #include "wayland_server.h" #include "workspace.h" @@ -68,6 +69,7 @@ WaylandTestApplication::WaylandTestApplication(OperationMode mode, int &argc, ch removeLibraryPath(ownPath); addLibraryPath(ownPath); + setSession(Session::create(Session::Type::Noop)); setPlatform(std::make_unique()); WaylandServer::create(this); setProcessStartupEnvironment(QProcessEnvironment::systemEnvironment()); diff --git a/src/backends/drm/drm_backend.cpp b/src/backends/drm/drm_backend.cpp index d8f8cc02e1..f54d8b1fb3 100644 --- a/src/backends/drm/drm_backend.cpp +++ b/src/backends/drm/drm_backend.cpp @@ -78,11 +78,11 @@ static QStringList splitPathList(const QString &input, const QChar delimiter) return ret; } -DrmBackend::DrmBackend(QObject *parent) +DrmBackend::DrmBackend(Session *session, QObject *parent) : Platform(parent) , m_udev(std::make_unique()) , m_udevMonitor(m_udev->monitor()) - , m_session(Session::create()) + , m_session(session) , m_explicitGpus(splitPathList(qEnvironmentVariable("KWIN_DRM_DEVICES"), ':')) , m_dpmsFilter() { @@ -93,16 +93,16 @@ DrmBackend::DrmBackend(QObject *parent) DrmBackend::~DrmBackend() = default; +Session *DrmBackend::session() const +{ + return m_session; +} + bool DrmBackend::isActive() const { return m_active; } -Session *DrmBackend::session() const -{ - return m_session.get(); -} - Outputs DrmBackend::outputs() const { return m_outputs; @@ -196,17 +196,17 @@ void DrmBackend::deactivate() bool DrmBackend::initialize() { // TODO: Pause/Resume individual GPU devices instead. - connect(session(), &Session::devicePaused, this, [this](dev_t deviceId) { + connect(m_session, &Session::devicePaused, this, [this](dev_t deviceId) { if (primaryGpu()->deviceId() == deviceId) { deactivate(); } }); - connect(session(), &Session::deviceResumed, this, [this](dev_t deviceId) { + connect(m_session, &Session::deviceResumed, this, [this](dev_t deviceId) { if (primaryGpu()->deviceId() == deviceId) { reactivate(); } }); - connect(session(), &Session::awoke, this, &DrmBackend::turnOutputsOn); + connect(m_session, &Session::awoke, this, &DrmBackend::turnOutputsOn); if (!m_explicitGpus.isEmpty()) { for (const QString &fileName : m_explicitGpus) { @@ -280,7 +280,7 @@ void DrmBackend::handleUdevEvent() DrmGpu *DrmBackend::addGpu(const QString &fileName) { - int fd = session()->openRestricted(fileName); + int fd = m_session->openRestricted(fileName); if (fd < 0) { qCWarning(KWIN_DRM) << "failed to open drm device at" << fileName; return nullptr; @@ -290,7 +290,7 @@ DrmGpu *DrmBackend::addGpu(const QString &fileName) drmModeRes *resources = drmModeGetResources(fd); if (!resources) { qCDebug(KWIN_DRM) << "Skipping KMS incapable drm device node at" << fileName; - session()->closeRestricted(fd); + m_session->closeRestricted(fd); return nullptr; } drmModeFreeResources(resources); @@ -298,7 +298,7 @@ DrmGpu *DrmBackend::addGpu(const QString &fileName) struct stat buf; if (fstat(fd, &buf) == -1) { qCDebug(KWIN_DRM, "Failed to fstat %s: %s", qPrintable(fileName), strerror(errno)); - session()->closeRestricted(fd); + m_session->closeRestricted(fd); return nullptr; } @@ -549,7 +549,7 @@ void DrmBackend::enableOutput(DrmAbstractOutput *output, bool enable) std::unique_ptr DrmBackend::createInputBackend() { - return std::make_unique(session()); + return std::make_unique(m_session); } std::unique_ptr DrmBackend::createQPainterBackend() diff --git a/src/backends/drm/drm_backend.h b/src/backends/drm/drm_backend.h index 8f7f1396db..70794cc155 100644 --- a/src/backends/drm/drm_backend.h +++ b/src/backends/drm/drm_backend.h @@ -24,6 +24,7 @@ struct gbm_bo; namespace KWin { +class Session; class Udev; class UdevMonitor; class UdevDevice; @@ -39,16 +40,17 @@ class KWIN_EXPORT DrmBackend : public Platform Q_OBJECT public: - explicit DrmBackend(QObject *parent = nullptr); + explicit DrmBackend(Session *session, QObject *parent = nullptr); ~DrmBackend() override; + Session *session() const; + std::unique_ptr createInputBackend() override; std::unique_ptr createQPainterBackend() override; std::unique_ptr createOpenGLBackend() override; std::optional testCreateDmaBuf(const QSize &size, quint32 format, const QVector &modifiers) override; std::shared_ptr createDmaBufTexture(const QSize &size, quint32 format, const uint64_t modifier) override; - Session *session() const override; bool initialize() override; Outputs outputs() const override; @@ -100,7 +102,7 @@ private: std::unique_ptr m_udev; std::unique_ptr m_udevMonitor; - std::unique_ptr m_session; + Session *m_session; // all outputs, enabled and disabled QVector m_outputs; // only enabled outputs diff --git a/src/backends/virtual/virtual_backend.cpp b/src/backends/virtual/virtual_backend.cpp index e594ac27af..aaf0113fa1 100644 --- a/src/backends/virtual/virtual_backend.cpp +++ b/src/backends/virtual/virtual_backend.cpp @@ -9,7 +9,6 @@ #include "virtual_backend.h" #include "composite.h" -#include "session.h" #include "virtual_egl_backend.h" #include "virtual_output.h" #include "virtual_qpainter_backend.h" @@ -21,7 +20,6 @@ namespace KWin VirtualBackend::VirtualBackend(QObject *parent) : Platform(parent) - , m_session(Session::create(Session::Type::Noop)) { if (qEnvironmentVariableIsSet("KWIN_WAYLAND_VIRTUAL_SCREENSHOTS")) { m_screenshotDir.reset(new QTemporaryDir); @@ -45,11 +43,6 @@ VirtualBackend::~VirtualBackend() } } -Session *VirtualBackend::session() const -{ - return m_session.get(); -} - bool VirtualBackend::initialize() { /* diff --git a/src/backends/virtual/virtual_backend.h b/src/backends/virtual/virtual_backend.h index 06ce0b5eb5..1d91880af5 100644 --- a/src/backends/virtual/virtual_backend.h +++ b/src/backends/virtual/virtual_backend.h @@ -30,7 +30,6 @@ public: VirtualBackend(QObject *parent = nullptr); ~VirtualBackend() override; - Session *session() const override; bool initialize() override; bool saveFrames() const @@ -67,7 +66,6 @@ private: QVector m_outputs; QVector m_outputsEnabled; std::unique_ptr m_screenshotDir; - std::unique_ptr m_session; }; } // namespace KWin diff --git a/src/backends/wayland/wayland_backend.cpp b/src/backends/wayland/wayland_backend.cpp index f8f24fd663..05b035538e 100644 --- a/src/backends/wayland/wayland_backend.cpp +++ b/src/backends/wayland/wayland_backend.cpp @@ -14,7 +14,6 @@ #include #endif #include "renderloop_p.h" -#include "session.h" #include "wayland_logging.h" #include "wayland_output.h" #include "wayland_qpainter_backend.h" @@ -568,7 +567,6 @@ void WaylandSeat::destroyTouchDevice() WaylandBackend::WaylandBackend(QObject *parent) : Platform(parent) - , m_session(Session::create(Session::Type::Noop)) , m_display(nullptr) , m_eventQueue(new EventQueue(this)) , m_registry(new Registry(this)) @@ -710,11 +708,6 @@ bool WaylandBackend::initialize() return true; } -Session *WaylandBackend::session() const -{ - return m_session.get(); -} - void WaylandBackend::initConnection() { connect( diff --git a/src/backends/wayland/wayland_backend.h b/src/backends/wayland/wayland_backend.h index edc9930ab5..f975e907f8 100644 --- a/src/backends/wayland/wayland_backend.h +++ b/src/backends/wayland/wayland_backend.h @@ -252,7 +252,6 @@ public: explicit WaylandBackend(QObject *parent = nullptr); ~WaylandBackend() override; bool initialize() override; - Session *session() const override; wl_display *display(); KWayland::Client::Compositor *compositor(); KWayland::Client::SubCompositor *subCompositor(); @@ -330,7 +329,6 @@ private: WaylandOutput *createOutput(const QString &name, const QPoint &position, const QSize &size); - std::unique_ptr m_session; wl_display *m_display; KWayland::Client::EventQueue *m_eventQueue; KWayland::Client::Registry *m_registry; diff --git a/src/backends/x11/standalone/x11_standalone_platform.cpp b/src/backends/x11/standalone/x11_standalone_platform.cpp index f55a190578..1fd32053ee 100644 --- a/src/backends/x11/standalone/x11_standalone_platform.cpp +++ b/src/backends/x11/standalone/x11_standalone_platform.cpp @@ -100,7 +100,6 @@ bool XrandrEventFilter::event(xcb_generic_event_t *event) X11StandalonePlatform::X11StandalonePlatform(QObject *parent) : Platform(parent) - , m_session(Session::create(Session::Type::Noop)) , m_updateOutputsTimer(new QTimer(this)) , m_x11Display(QX11Info::display()) , m_renderLoop(std::make_unique()) @@ -154,11 +153,6 @@ bool X11StandalonePlatform::initialize() return true; } -Session *X11StandalonePlatform::session() const -{ - return m_session.get(); -} - std::unique_ptr X11StandalonePlatform::createOpenGLBackend() { switch (options->glPlatformInterface()) { diff --git a/src/backends/x11/standalone/x11_standalone_platform.h b/src/backends/x11/standalone/x11_standalone_platform.h index 230a7a14c1..e0db42ab32 100644 --- a/src/backends/x11/standalone/x11_standalone_platform.h +++ b/src/backends/x11/standalone/x11_standalone_platform.h @@ -35,7 +35,6 @@ public: X11StandalonePlatform(QObject *parent = nullptr); ~X11StandalonePlatform() override; bool initialize() override; - Session *session() const override; std::unique_ptr createOpenGLBackend() override; Edge *createScreenEdge(ScreenEdges *parent) override; @@ -86,7 +85,6 @@ private: void updateRefreshRate(); void updateCursor(); - std::unique_ptr m_session; std::unique_ptr m_xinputIntegration; QThread *m_openGLFreezeProtectionThread = nullptr; QTimer *m_openGLFreezeProtection = nullptr; diff --git a/src/backends/x11/windowed/x11_windowed_backend.cpp b/src/backends/x11/windowed/x11_windowed_backend.cpp index b709d3ff8e..ab26578d3d 100644 --- a/src/backends/x11/windowed/x11_windowed_backend.cpp +++ b/src/backends/x11/windowed/x11_windowed_backend.cpp @@ -11,7 +11,6 @@ #include -#include "session.h" #include "utils/xcbutils.h" #include "wayland_server.h" #include "x11_windowed_egl_backend.h" @@ -164,7 +163,6 @@ void X11WindowedInputBackend::initialize() X11WindowedBackend::X11WindowedBackend(QObject *parent) : Platform(parent) - , m_session(Session::create(Session::Type::Noop)) { setSupportsPointerWarping(true); } @@ -234,11 +232,6 @@ bool X11WindowedBackend::initialize() } } -Session *X11WindowedBackend::session() const -{ - return m_session.get(); -} - void X11WindowedBackend::initXInput() { #if HAVE_X11_XINPUT diff --git a/src/backends/x11/windowed/x11_windowed_backend.h b/src/backends/x11/windowed/x11_windowed_backend.h index 38bc3b0a53..c2e23bfd45 100644 --- a/src/backends/x11/windowed/x11_windowed_backend.h +++ b/src/backends/x11/windowed/x11_windowed_backend.h @@ -88,7 +88,6 @@ public: X11WindowedBackend(QObject *parent = nullptr); ~X11WindowedBackend() override; bool initialize() override; - Session *session() const override; xcb_connection_t *connection() const { @@ -151,7 +150,6 @@ private: void initXInput(); X11WindowedOutput *findOutput(xcb_window_t window) const; - std::unique_ptr m_session; xcb_connection_t *m_connection = nullptr; xcb_screen_t *m_screen = nullptr; xcb_key_symbols_t *m_keySymbols = nullptr; diff --git a/src/colors/colormanager.cpp b/src/colors/colormanager.cpp index 79e7e6f9f4..de54d6598c 100644 --- a/src/colors/colormanager.cpp +++ b/src/colors/colormanager.cpp @@ -25,7 +25,6 @@ ColorManager::ColorManager() : d(std::make_unique()) { Platform *platform = kwinApp()->platform(); - Session *session = platform->session(); const QVector outputs = platform->enabledOutputs(); for (Output *output : outputs) { @@ -34,7 +33,7 @@ ColorManager::ColorManager() connect(platform, &Platform::outputEnabled, this, &ColorManager::handleOutputEnabled); connect(platform, &Platform::outputDisabled, this, &ColorManager::handleOutputDisabled); - connect(session, &Session::activeChanged, this, &ColorManager::handleSessionActiveChanged); + connect(kwinApp()->session(), &Session::activeChanged, this, &ColorManager::handleSessionActiveChanged); } ColorManager::~ColorManager() = default; diff --git a/src/input.cpp b/src/input.cpp index 925ee08d24..44aec4f23c 100644 --- a/src/input.cpp +++ b/src/input.cpp @@ -316,7 +316,7 @@ public: if (event->type() == QEvent::KeyPress && !event->isAutoRepeat()) { const xkb_keysym_t keysym = event->nativeVirtualKey(); if (keysym >= XKB_KEY_XF86Switch_VT_1 && keysym <= XKB_KEY_XF86Switch_VT_12) { - kwinApp()->platform()->session()->switchTo(keysym - XKB_KEY_XF86Switch_VT_1 + 1); + kwinApp()->session()->switchTo(keysym - XKB_KEY_XF86Switch_VT_1 + 1); return true; } } @@ -2846,7 +2846,7 @@ private: void InputRedirection::setupInputFilters() { const bool hasGlobalShortcutSupport = waylandServer()->hasGlobalShortcutSupport(); - if ((kwinApp()->platform()->session()->capabilities() & Session::Capability::SwitchTerminal) + if ((kwinApp()->session()->capabilities() & Session::Capability::SwitchTerminal) && hasGlobalShortcutSupport) { installInputEventFilter(new VirtualTerminalFilter); } diff --git a/src/main.cpp b/src/main.cpp index 5582ab871a..c13ddc85a3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -23,6 +23,7 @@ #if KWIN_BUILD_SCREENLOCKER #include "screenlockerwatcher.h" #endif +#include "session.h" #include "sm.h" #include "utils/xcbutils.h" #include "wayland/surface_interface.h" @@ -125,6 +126,7 @@ Application::~Application() destroyColorManager(); destroyAtoms(); destroyPlatform(); + m_session.reset(); } void Application::notifyStarted() @@ -553,6 +555,12 @@ void Application::setPlatform(std::unique_ptr &&platform) m_platform = std::move(platform); } +void Application::setSession(std::unique_ptr &&session) +{ + Q_ASSERT(!m_session); + m_session = std::move(session); +} + PluginManager *Application::pluginManager() const { return m_pluginManager.get(); diff --git a/src/main.h b/src/main.h index 70cb3f6449..49f9b76744 100644 --- a/src/main.h +++ b/src/main.h @@ -28,6 +28,7 @@ namespace KWin { class Platform; +class Session; class X11EventFilter; class PluginManager; class InputMethod; @@ -228,6 +229,12 @@ public: } void setPlatform(std::unique_ptr &&platform); + Session *session() const + { + return m_session.get(); + } + void setSession(std::unique_ptr &&session); + bool isTerminating() const { return m_terminating; @@ -297,6 +304,7 @@ private: #if KWIN_BUILD_ACTIVITIES bool m_useKActivities = true; #endif + std::unique_ptr m_session; std::unique_ptr m_platform; bool m_terminating = false; qreal m_xwaylandScale = 1; diff --git a/src/main_wayland.cpp b/src/main_wayland.cpp index 05f621d957..07256d13bc 100644 --- a/src/main_wayland.cpp +++ b/src/main_wayland.cpp @@ -18,6 +18,7 @@ #include "effects.h" #include "inputmethod.h" #include "platform.h" +#include "session.h" #include "tabletmodemanager.h" #include "utils/realtime.h" #include "wayland/display.h" @@ -542,15 +543,23 @@ int main(int argc, char *argv[]) switch (backendType) { case BackendType::Kms: - a.setPlatform(std::make_unique()); + a.setSession(KWin::Session::create()); + if (!a.session()) { + std::cerr << "FATAl ERROR: could not acquire a session" << std::endl; + return 1; + } + a.setPlatform(std::make_unique(a.session())); break; case BackendType::Virtual: + a.setSession(KWin::Session::create(KWin::Session::Type::Noop)); a.setPlatform(std::make_unique()); break; case BackendType::X11: + a.setSession(KWin::Session::create(KWin::Session::Type::Noop)); a.setPlatform(std::make_unique()); break; case BackendType::Wayland: + a.setSession(KWin::Session::create(KWin::Session::Type::Noop)); a.setPlatform(std::make_unique()); break; } diff --git a/src/main_x11.cpp b/src/main_x11.cpp index 0acf1c95d8..cef3d2a12c 100644 --- a/src/main_x11.cpp +++ b/src/main_x11.cpp @@ -14,6 +14,7 @@ #include "backends/x11/standalone/x11_standalone_platform.h" #include "platform.h" +#include "session.h" #include "sm.h" #include "tabletmodemanager.h" #include "utils/xcbutils.h" @@ -410,6 +411,7 @@ int main(int argc, char *argv[]) exit(1); } + a.setSession(KWin::Session::create(KWin::Session::Type::Noop)); a.setPlatform(std::make_unique()); a.start(); diff --git a/src/platform.h b/src/platform.h index 727a4e9b4b..41f1c1574e 100644 --- a/src/platform.h +++ b/src/platform.h @@ -42,7 +42,6 @@ class OutlineVisual; class QPainterBackend; class Scene; class ScreenEdges; -class Session; class OutputConfiguration; struct DmaBufParams; @@ -64,7 +63,6 @@ class KWIN_EXPORT Platform : public QObject public: ~Platform() override; - virtual Session *session() const = 0; virtual bool initialize() = 0; virtual std::unique_ptr createInputBackend(); virtual std::unique_ptr createOpenGLBackend(); diff --git a/src/plugins/nightcolor/nightcolormanager.cpp b/src/plugins/nightcolor/nightcolormanager.cpp index a192ae76fa..75edd6fa5e 100644 --- a/src/plugins/nightcolor/nightcolormanager.cpp +++ b/src/plugins/nightcolor/nightcolormanager.cpp @@ -101,7 +101,7 @@ NightColorManager::NightColorManager() connect(kwinApp()->colorManager(), &ColorManager::deviceAdded, this, &NightColorManager::hardReset); - connect(kwinApp()->platform()->session(), &Session::activeChanged, this, [this](bool active) { + connect(kwinApp()->session(), &Session::activeChanged, this, [this](bool active) { if (active) { hardReset(); } else { diff --git a/src/utils/udev.cpp b/src/utils/udev.cpp index 17fc2de7c2..02dec3960e 100644 --- a/src/utils/udev.cpp +++ b/src/utils/udev.cpp @@ -115,7 +115,7 @@ std::vector UdevEnumerate::find() if (deviceSeat.isEmpty()) { deviceSeat = defaultSeat; } - if (deviceSeat != kwinApp()->platform()->session()->seat()) { + if (deviceSeat != kwinApp()->session()->seat()) { continue; } vect.push_back(std::move(device));