From 716b42a99e179975201a69df89170c7edb701497 Mon Sep 17 00:00:00 2001 From: Roman Gilg Date: Mon, 22 Jan 2024 20:38:39 +0100 Subject: [PATCH 1/2] refactor: add session manager interface class This way we can split up the implementation in the future for different windowing systems. --- como/win/CMakeLists.txt | 15 +++++----- como/win/dbus/session_manager.cpp | 20 ++++++++++++++ como/win/dbus/session_manager.h | 46 +++++++++++++++++++++++++++++++ como/win/x11/session_manager.cpp | 13 +-------- como/win/x11/session_manager.h | 31 +++++++-------------- 5 files changed, 84 insertions(+), 41 deletions(-) create mode 100644 como/win/dbus/session_manager.cpp create mode 100644 como/win/dbus/session_manager.h diff --git a/como/win/CMakeLists.txt b/como/win/CMakeLists.txt index 5806e1faa..bb21b69a3 100644 --- a/como/win/CMakeLists.txt +++ b/como/win/CMakeLists.txt @@ -24,6 +24,7 @@ target_sources(win FILE_SET HEADERS FILES dbus/appmenu.h + dbus/session_manager.h dbus/virtual_desktop_manager.h dbus/virtual_desktop_types.h deco/bridge.h @@ -129,6 +130,7 @@ target_sources(win PRIVATE cursor_shape.cpp dbus/appmenu.cpp + dbus/session_manager.cpp dbus/virtual_desktop_manager.cpp dbus/virtual_desktop_types.cpp deco/palette.cpp @@ -184,6 +186,11 @@ qt6_add_dbus_interface(win_dbus_src ${KSCREENLOCKER_DBUS_INTERFACES_DIR}/kf6_org.freedesktop.ScreenSaver.xml screenlocker_interface ) +qt6_add_dbus_adaptor(win_dbus_src + dbus/org.kde.KWin.Session.xml + dbus/session_manager.h + como::win::dbus::session_manager +) target_sources(win PRIVATE ${win_dbus_src}) @@ -295,14 +302,6 @@ target_sources(win-x11 x11/net/win_info.cpp ) -qt6_add_dbus_adaptor(win_x11_dbus_src - dbus/org.kde.KWin.Session.xml - x11/session_manager.h - como::win::x11::session_manager -) - -target_sources(win-x11 PRIVATE ${win_x11_dbus_src}) - add_library(win-x11-backend SHARED) target_link_libraries(win-x11-backend diff --git a/como/win/dbus/session_manager.cpp b/como/win/dbus/session_manager.cpp new file mode 100644 index 000000000..b39dca6b4 --- /dev/null +++ b/como/win/dbus/session_manager.cpp @@ -0,0 +1,20 @@ +/* + SPDX-FileCopyrightText: 2024 Roman Gilg + + SPDX-License-Identifier: GPL-2.0-or-later +*/ +#include "session_manager.h" + +// Include first to not clash with later X definitions in other includes. +#include "sessionadaptor.h" + +namespace como::win::dbus +{ + +session_manager::session_manager() +{ + new SessionAdaptor(this); + QDBusConnection::sessionBus().registerObject(QStringLiteral("/Session"), this); +} + +} diff --git a/como/win/dbus/session_manager.h b/como/win/dbus/session_manager.h new file mode 100644 index 000000000..0b14d54e2 --- /dev/null +++ b/como/win/dbus/session_manager.h @@ -0,0 +1,46 @@ +/* + SPDX-FileCopyrightText: 2024 Roman Gilg + + SPDX-License-Identifier: GPL-2.0-or-later +*/ +#pragma once + +#include +#include + +#include + +namespace como::win::dbus +{ + +class COMO_EXPORT session_manager : public QObject +{ + Q_OBJECT +public: + session_manager(); + +public Q_SLOTS: + virtual void setState(uint /*state*/) + { + } + virtual void loadSession(QString const& /*name*/) + { + } + virtual void aboutToSaveSession(QString const& /*name*/) + { + } + virtual void finishSaveSession(QString const& /*name*/) + { + } + virtual void quit() + { + } + +Q_SIGNALS: + void stateChanged(session_state prev, session_state next); + void loadSessionRequested(QString const& name); + void prepareSessionSaveRequested(QString const& name); + void finishSessionSaveRequested(QString const& name); +}; + +} diff --git a/como/win/x11/session_manager.cpp b/como/win/x11/session_manager.cpp index 08d562194..efc8f0cf5 100644 --- a/como/win/x11/session_manager.cpp +++ b/como/win/x11/session_manager.cpp @@ -7,9 +7,6 @@ */ #include "session_manager.h" -// Include first to not clash with later X definitions in other includes. -#include "sessionadaptor.h" - #include #include #include @@ -23,15 +20,7 @@ namespace como::win::x11 { -session_manager::session_manager() -{ - new SessionAdaptor(this); - QDBusConnection::sessionBus().registerObject(QStringLiteral("/Session"), this); -} - -session_manager::~session_manager() -{ -} +session_manager::~session_manager() = default; session_state session_manager::state() const { diff --git a/como/win/x11/session_manager.h b/como/win/x11/session_manager.h index b685b41a4..c21a96a9a 100644 --- a/como/win/x11/session_manager.h +++ b/como/win/x11/session_manager.h @@ -7,39 +7,28 @@ */ #pragma once -#include "types.h" +#include +#include +#include -#include "como_export.h" - -#include #include namespace como::win::x11 { -class COMO_EXPORT session_manager : public QObject +class COMO_EXPORT session_manager : public dbus::session_manager { - Q_OBJECT public: - session_manager(); ~session_manager() override; session_state state() const; -Q_SIGNALS: - void stateChanged(session_state prev, session_state next); - - void loadSessionRequested(const QString& name); - void prepareSessionSaveRequested(const QString& name); - void finishSessionSaveRequested(const QString& name); - -public Q_SLOTS: - // DBus API - void setState(uint state); - void loadSession(const QString& name); - void aboutToSaveSession(const QString& name); - void finishSaveSession(const QString& name); - void quit(); +public: + void setState(uint state) override; + void loadSession(const QString& name) override; + void aboutToSaveSession(const QString& name) override; + void finishSaveSession(const QString& name) override; + void quit() override; private: void setState(session_state state); From c91942938317e2695199b6fee3abf445aa755aa3 Mon Sep 17 00:00:00 2001 From: Roman Gilg Date: Mon, 22 Jan 2024 23:23:12 +0100 Subject: [PATCH 2/2] feat(wl): expose method to allow closing windows on shutdown This allows Plasma to gracefully close windows on shutdown. For now this is only a stub in order to provide compatibility. We require logic similar to [1] in order to wait on windows closing and react to user input. But this includes many KDE dependencies into our windowing code what we first might want to isolate some more. [1] https://invent.kde.org/plasma/kwin/-/commit/4cdf27e74c --- como/win/CMakeLists.txt | 1 + como/win/dbus/org.kde.KWin.Session.xml | 4 +++- como/win/dbus/session_manager.h | 4 ++++ como/win/wayland/session_manager.h | 21 +++++++++++++++++++++ como/win/wayland/space.h | 5 ++++- 5 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 como/win/wayland/session_manager.h diff --git a/como/win/CMakeLists.txt b/como/win/CMakeLists.txt index bb21b69a3..b303f0786 100644 --- a/como/win/CMakeLists.txt +++ b/como/win/CMakeLists.txt @@ -341,6 +341,7 @@ target_sources(win-wl wayland/plasma_window.h wayland/popup_placement.h wayland/scene.h + wayland/session_manager.h wayland/setup.h wayland/space.h wayland/space_areas.h diff --git a/como/win/dbus/org.kde.KWin.Session.xml b/como/win/dbus/org.kde.KWin.Session.xml index ad80f052a..efb327702 100644 --- a/como/win/dbus/org.kde.KWin.Session.xml +++ b/como/win/dbus/org.kde.KWin.Session.xml @@ -22,6 +22,8 @@ + + + - diff --git a/como/win/dbus/session_manager.h b/como/win/dbus/session_manager.h index 0b14d54e2..490f34098 100644 --- a/como/win/dbus/session_manager.h +++ b/como/win/dbus/session_manager.h @@ -32,6 +32,10 @@ public Q_SLOTS: virtual void finishSaveSession(QString const& /*name*/) { } + virtual bool closeWaylandWindows() + { + return true; + } virtual void quit() { } diff --git a/como/win/wayland/session_manager.h b/como/win/wayland/session_manager.h new file mode 100644 index 000000000..c3b711962 --- /dev/null +++ b/como/win/wayland/session_manager.h @@ -0,0 +1,21 @@ +/* + SPDX-FileCopyrightText: 2024 Roman Gilg + SPDX-License-Identifier: GPL-2.0-or-later +*/ +#pragma once + +#include + +namespace como::win::wayland +{ + +class session_manager : public dbus::session_manager +{ +public: + bool closeWaylandWindows() override + { + return true; + } +}; + +} diff --git a/como/win/wayland/space.h b/como/win/wayland/space.h index 5475c6d41..05b7097bb 100644 --- a/como/win/wayland/space.h +++ b/como/win/wayland/space.h @@ -7,7 +7,6 @@ #include "subsurface.h" #include "surface.h" -#include #include #include @@ -17,7 +16,9 @@ #include #include #include +#include #include +#include #include @@ -46,6 +47,7 @@ class space { space_setup_init(*this, render, input); init_space(*this); + session_manager = std::make_unique(); } virtual ~space() @@ -130,6 +132,7 @@ class space std::vector oldrestrictedmovearea; std::unique_ptr subspace_manager; + std::unique_ptr session_manager; QTimer* m_quickTileCombineTimer{nullptr}; win::quicktiles m_lastTilingMode{win::quicktiles::none};