#pragma once #include #include #include #include #include "../../core/model.hpp" #include "../../windowmanager/workspace.hpp" #include "ext_workspace.hpp" namespace qs::wm::wayland { namespace impl = qs::wayland::workspace; class WlWorkspace; class WlWorkspaceGroup; class WorkspaceManager: public QObject { Q_OBJECT; public: static WorkspaceManager* instance(); ObjectModel mWorkspaces {this}; ObjectModel mWorkspaceGroups {this}; static void commit(); private slots: void onServerCommit(); void onWorkspaceCreated(impl::Workspace* workspace); void onWorkspaceDestroyed(impl::Workspace* workspace); void onGroupCreated(impl::WorkspaceGroup* group); void onGroupDestroyed(impl::WorkspaceGroup* group); private: WorkspaceManager(); QList pendingWorkspaceCreations; QList pendingWorkspaceDestructions; QHash workspaceByImpl; QList pendingGroupCreations; QList pendingGroupDestructions; QHash groupsByImpl; friend class WlWorkspace; }; class WlWorkspace: public Workspace { public: WlWorkspace(WorkspaceManager* manager, impl::Workspace* impl); void commitImpl(); void activate() override; void deactivate() override; void remove() override; void setGroup(WorkspaceGroup* group) override; [[nodiscard]] WorkspaceManager* manager() { return static_cast(this->parent()); // NOLINT } private: impl::Workspace* impl = nullptr; }; class WlWorkspaceGroup: public WorkspaceGroup { public: WlWorkspaceGroup(WorkspaceManager* manager, impl::WorkspaceGroup* impl); void commitImpl(); [[nodiscard]] WorkspaceManager* manager() { return static_cast(this->parent()); // NOLINT } private: impl::WorkspaceGroup* impl = nullptr; friend class WlWorkspace; }; } // namespace qs::wm::wayland