17 #include "WorkspaceManager.h" 18 #include "Workspace.h" 19 #include "TopLevelWindowModel.h" 20 #include "WindowManagerObjects.h" 21 #include <unity/shell/application/SurfaceManagerInterface.h> 24 #include <QGuiApplication> 28 WorkspaceManager *WorkspaceManager::instance()
30 static WorkspaceManager* workspaceManager(
new WorkspaceManager());
31 return workspaceManager;
34 WorkspaceManager::WorkspaceManager()
35 : m_activeWorkspace(nullptr),
36 m_surfaceManager(nullptr)
38 connect(WindowManagerObjects::instance(), &WindowManagerObjects::surfaceManagerChanged,
39 this, &WorkspaceManager::setSurfaceManager);
41 setSurfaceManager(WindowManagerObjects::instance()->surfaceManager());
44 void WorkspaceManager::setSurfaceManager(unity::shell::application::SurfaceManagerInterface *surfaceManager)
46 if (m_surfaceManager == surfaceManager)
return;
48 if (m_surfaceManager) {
49 disconnect(m_surfaceManager, &QObject::destroyed,
this, 0);
52 m_surfaceManager = surfaceManager;
54 if (m_surfaceManager) {
55 connect(m_surfaceManager, &QObject::destroyed,
this, [
this](){
56 setSurfaceManager(
nullptr);
61 Workspace *WorkspaceManager::createWorkspace()
63 auto workspace =
new ConcreteWorkspace(
this);
64 QQmlEngine::setObjectOwnership(workspace, QQmlEngine::CppOwnership);
65 m_allWorkspaces.insert(workspace);
67 if (m_allWorkspaces.count() == 0 && m_activeWorkspace) {
68 setActiveWorkspace(
nullptr);
69 }
else if (m_allWorkspaces.count() == 1) {
70 setActiveWorkspace(workspace);
76 void WorkspaceManager::destroyWorkspace(Workspace *workspace)
78 if (!workspace)
return;
80 if (workspace->isAssigned()) {
81 workspace->unassign();
83 m_allWorkspaces.remove(workspace);
85 if (m_activeWorkspace == workspace) {
86 setActiveWorkspace(m_allWorkspaces.count() ? *m_allWorkspaces.begin() :
nullptr);
88 if (m_activeWorkspace) {
89 moveWorkspaceContentToWorkspace(m_activeWorkspace, workspace);
92 disconnect(workspace, 0,
this, 0);
95 void WorkspaceManager::moveSurfaceToWorkspace(unity::shell::application::MirSurfaceInterface *surface, Workspace *workspace)
97 if (m_surfaceManager) {
98 m_surfaceManager->moveSurfaceToWorkspace(surface, workspace->workspace());
102 void WorkspaceManager::moveWorkspaceContentToWorkspace(Workspace *to, Workspace *from)
104 if (m_surfaceManager) {
105 m_surfaceManager->moveWorkspaceContentToWorkspace(to->workspace(), from->workspace());
109 Workspace *WorkspaceManager::activeWorkspace()
const 111 return m_activeWorkspace;
114 void WorkspaceManager::setActiveWorkspace(Workspace *workspace)
116 if (workspace != m_activeWorkspace) {
117 m_activeWorkspace = workspace;
118 Q_EMIT activeWorkspaceChanged(workspace);
122 void WorkspaceManager::setActiveWorkspace2(Workspace *workspace)
124 if (!workspace)
return;
125 workspace->activate();