/* * Copyright (C) 2017 Canonical, Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "WindowManagementPolicy.h" WindowManagementPolicy::WindowManagementPolicy(const miral::WindowManagerTools &tools, qtmir::WindowManagementPolicyPrivate &dd) : qtmir::WindowManagementPolicy(tools, dd) , m_dummyWorkspace(this->tools.create_workspace()) { wmPolicyInterface = this; // we must always have a active workspace. m_activeWorkspace = m_dummyWorkspace; } void WindowManagementPolicy::advise_new_window(miral::WindowInfo const& window_info) { qtmir::WindowManagementPolicy::advise_new_window(window_info); auto const parent = window_info.parent(); auto activeWorkspace = m_activeWorkspace.lock(); if (!parent && activeWorkspace) { tools.add_tree_to_workspace(window_info.window(), activeWorkspace); } } std::shared_ptr WindowManagementPolicy::createWorkspace() { auto workspace = tools.create_workspace(); m_workspaces.insert(workspace); if (m_activeWorkspace.lock() == m_dummyWorkspace) { tools.move_workspace_content_to_workspace(workspace, m_dummyWorkspace); m_activeWorkspace = workspace; } return workspace; } void WindowManagementPolicy::releaseWorkspace(const std::shared_ptr &workspace) { auto iter = m_workspaces.find(workspace); if (iter != m_workspaces.end()) m_workspaces.erase(iter); if (m_workspaces.size() == 0) { m_activeWorkspace = m_dummyWorkspace; tools.move_workspace_content_to_workspace(m_dummyWorkspace, workspace); } } void WindowManagementPolicy::setActiveWorkspace(const std::shared_ptr &workspace) { if (m_activeWorkspace.lock() == workspace) return; m_activeWorkspace = workspace ? workspace : m_dummyWorkspace; }