Unity 8
WorkspaceManager.cpp
1 /*
2  * Copyright (C) 2017 Canonical, Ltd.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; version 3.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  */
16 
17 #include "WorkspaceManager.h"
18 #include "Workspace.h"
19 #include "TopLevelWindowModel.h"
20 #include "WindowManagerObjects.h"
21 #include <unity/shell/application/SurfaceManagerInterface.h>
22 
23 // Qt
24 #include <QGuiApplication>
25 #include <QScreen>
26 #include <QQmlEngine>
27 
28 WorkspaceManager *WorkspaceManager::instance()
29 {
30  static WorkspaceManager* workspaceManager(new WorkspaceManager());
31  return workspaceManager;
32 }
33 
34 WorkspaceManager::WorkspaceManager()
35  : m_activeWorkspace(nullptr),
36  m_surfaceManager(nullptr)
37 {
38  connect(WindowManagerObjects::instance(), &WindowManagerObjects::surfaceManagerChanged,
39  this, &WorkspaceManager::setSurfaceManager);
40 
41  setSurfaceManager(WindowManagerObjects::instance()->surfaceManager());
42 }
43 
44 void WorkspaceManager::setSurfaceManager(unity::shell::application::SurfaceManagerInterface *surfaceManager)
45 {
46  if (m_surfaceManager == surfaceManager) return;
47 
48  if (m_surfaceManager) {
49  disconnect(m_surfaceManager, &QObject::destroyed, this, 0);
50  }
51 
52  m_surfaceManager = surfaceManager;
53 
54  if (m_surfaceManager) {
55  connect(m_surfaceManager, &QObject::destroyed, this, [this](){
56  setSurfaceManager(nullptr);
57  });
58  }
59 }
60 
61 Workspace *WorkspaceManager::createWorkspace()
62 {
63  auto workspace = new ConcreteWorkspace(this);
64  QQmlEngine::setObjectOwnership(workspace, QQmlEngine::CppOwnership);
65  m_allWorkspaces.insert(workspace);
66 
67  if (m_allWorkspaces.count() == 0 && m_activeWorkspace) {
68  setActiveWorkspace(nullptr);
69  } else if (m_allWorkspaces.count() == 1) {
70  setActiveWorkspace(workspace);
71  }
72 
73  return workspace;
74 }
75 
76 void WorkspaceManager::destroyWorkspace(Workspace *workspace)
77 {
78  if (!workspace) return;
79 
80  if (workspace->isAssigned()) {
81  workspace->unassign();
82  }
83  m_allWorkspaces.remove(workspace);
84 
85  if (m_activeWorkspace == workspace) {
86  setActiveWorkspace(m_allWorkspaces.count() ? *m_allWorkspaces.begin() : nullptr);
87  }
88  if (m_activeWorkspace) {
89  moveWorkspaceContentToWorkspace(m_activeWorkspace, workspace);
90  }
91 
92  disconnect(workspace, 0, this, 0);
93 }
94 
95 void WorkspaceManager::moveSurfaceToWorkspace(unity::shell::application::MirSurfaceInterface *surface, Workspace *workspace)
96 {
97  if (m_surfaceManager) {
98  m_surfaceManager->moveSurfaceToWorkspace(surface, workspace->workspace());
99  }
100 }
101 
102 void WorkspaceManager::moveWorkspaceContentToWorkspace(Workspace *to, Workspace *from)
103 {
104  if (m_surfaceManager) {
105  m_surfaceManager->moveWorkspaceContentToWorkspace(to->workspace(), from->workspace());
106  }
107 }
108 
109 Workspace *WorkspaceManager::activeWorkspace() const
110 {
111  return m_activeWorkspace;
112 }
113 
114 void WorkspaceManager::setActiveWorkspace(Workspace *workspace)
115 {
116  if (workspace != m_activeWorkspace) {
117  m_activeWorkspace = workspace;
118  Q_EMIT activeWorkspaceChanged(workspace);
119  }
120 }
121 
122 void WorkspaceManager::setActiveWorkspace2(Workspace *workspace)
123 {
124  if (!workspace) return;
125  workspace->activate();
126 }