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));