17#include "WorkspaceManager.h"
19#include "TopLevelWindowModel.h"
20#include "WindowManagerObjects.h"
21#include <lomiri/shell/application/SurfaceManagerInterface.h>
24#include <QGuiApplication>
28WorkspaceManager *WorkspaceManager::instance()
30 static WorkspaceManager* workspaceManager = ([]() {
31 auto w =
new WorkspaceManager();
32 QQmlEngine::setObjectOwnership(w, QQmlEngine::CppOwnership);
35 return workspaceManager;
38WorkspaceManager::WorkspaceManager()
39 : m_activeWorkspace(nullptr),
40 m_surfaceManager(nullptr)
42 connect(WindowManagerObjects::instance(), &WindowManagerObjects::surfaceManagerChanged,
43 this, &WorkspaceManager::setSurfaceManager);
45 setSurfaceManager(WindowManagerObjects::instance()->surfaceManager());
48WorkspaceManager::~WorkspaceManager()
50 m_allWorkspaces.clear();
53void WorkspaceManager::setSurfaceManager(lomiri::shell::application::SurfaceManagerInterface *surfaceManager)
55 if (m_surfaceManager == surfaceManager)
return;
57 if (m_surfaceManager) {
58 disconnect(m_surfaceManager, &QObject::destroyed,
this, 0);
61 m_surfaceManager = surfaceManager;
63 if (m_surfaceManager) {
64 connect(m_surfaceManager, &QObject::destroyed,
this, [
this](){
65 setSurfaceManager(
nullptr);
70Workspace *WorkspaceManager::createWorkspace()
72 auto workspace =
new ConcreteWorkspace(
this);
73 QQmlEngine::setObjectOwnership(workspace, QQmlEngine::CppOwnership);
74 m_allWorkspaces.insert(workspace);
76 if (m_allWorkspaces.count() == 0 && m_activeWorkspace) {
77 setActiveWorkspace(
nullptr);
78 }
else if (m_allWorkspaces.count() == 1) {
79 setActiveWorkspace(workspace);
85void WorkspaceManager::destroyWorkspace(Workspace *workspace)
87 if (!workspace)
return;
89 if (workspace->isAssigned()) {
90 workspace->unassign();
92 m_allWorkspaces.remove(workspace);
94 if (m_activeWorkspace == workspace) {
95 setActiveWorkspace(m_allWorkspaces.count() ? *m_allWorkspaces.begin() : nullptr);
97 if (m_activeWorkspace) {
98 moveWorkspaceContentToWorkspace(m_activeWorkspace, workspace);
101 disconnect(workspace, 0,
this, 0);
104void WorkspaceManager::moveSurfaceToWorkspace(lomiri::shell::application::MirSurfaceInterface *surface, Workspace *workspace)
106 if (m_surfaceManager) {
107 m_surfaceManager->moveSurfaceToWorkspace(surface, workspace->workspace());
111void WorkspaceManager::moveWorkspaceContentToWorkspace(Workspace *to, Workspace *from)
113 if (m_surfaceManager) {
114 m_surfaceManager->moveWorkspaceContentToWorkspace(to->workspace(), from->workspace());
118Workspace *WorkspaceManager::activeWorkspace()
const
120 return m_activeWorkspace;
123void WorkspaceManager::setActiveWorkspace(Workspace *workspace)
125 if (workspace != m_activeWorkspace) {
126 m_activeWorkspace = workspace;
127 Q_EMIT activeWorkspaceChanged(workspace);
131void WorkspaceManager::setActiveWorkspace2(Workspace *workspace)
133 if (!workspace)
return;
134 workspace->activate();