2
* Copyright © 2015 Canonical Ltd.
4
* This program is free software: you can redistribute it and/or modify it
5
* under the terms of the GNU General Public License version 3,
6
* as published by the Free Software Foundation.
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.
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/>.
16
* Authored By: Alan Griffiths <alan@octopull.co.uk>
19
#include "mir/shell/default_window_manager.h"
21
#include "mir/scene/null_surface_observer.h"
22
#include "mir/scene/placement_strategy.h"
23
#include "mir/scene/session.h"
24
#include "mir/scene/session_coordinator.h"
25
#include "mir/scene/surface.h"
26
#include "mir/scene/surface_creation_parameters.h"
27
#include "mir/shell/focus_controller.h"
28
#include "mir/shell/surface_specification.h"
30
namespace mf = mir::frontend;
31
namespace ms = mir::scene;
32
namespace msh = mir::shell;
34
msh::DefaultWindowManager::DefaultWindowManager(
35
FocusController* focus_controller,
36
std::shared_ptr<scene::PlacementStrategy> const& placement_strategy,
37
std::shared_ptr<scene::SessionCoordinator> const& session_coordinator) :
38
focus_controller{focus_controller},
39
placement_strategy{placement_strategy},
40
session_coordinator{session_coordinator}
44
void msh::DefaultWindowManager::add_session(std::shared_ptr<scene::Session> const& session)
46
focus_controller->set_focus_to(session, {});
49
void msh::DefaultWindowManager::remove_session(std::shared_ptr<scene::Session> const& /*session*/)
51
auto const next_session = session_coordinator->successor_of({});
53
focus_controller->set_focus_to(next_session, next_session->default_surface());
55
focus_controller->set_focus_to(next_session, {});
60
class SurfaceReadyObserver : public ms::NullSurfaceObserver,
61
public std::enable_shared_from_this<SurfaceReadyObserver>
65
msh::FocusController* const focus_controller,
66
std::shared_ptr<ms::Session> const& session,
67
std::shared_ptr<ms::Surface> const& surface) :
68
focus_controller{focus_controller},
75
void frame_posted(int) override
77
if (auto const s = surface.lock())
79
focus_controller->set_focus_to(session.lock(), s);
80
s->remove_observer(shared_from_this());
84
msh::FocusController* const focus_controller;
85
std::weak_ptr<ms::Session> const session;
86
std::weak_ptr<ms::Surface> const surface;
90
auto msh::DefaultWindowManager::add_surface(
91
std::shared_ptr<scene::Session> const& session,
92
scene::SurfaceCreationParameters const& params,
93
std::function<frontend::SurfaceId(std::shared_ptr<scene::Session> const& session, scene::SurfaceCreationParameters const& params)> const& build)
94
-> frontend::SurfaceId
96
auto const result = build(session, placement_strategy->place(*session, params));
97
auto const surface = session->surface(result);
99
surface->add_observer(std::make_shared<SurfaceReadyObserver>(focus_controller, session, surface));
104
void msh::DefaultWindowManager::modify_surface(
105
std::shared_ptr<scene::Session> const& /*session*/,
106
std::shared_ptr<scene::Surface> const& surface,
107
SurfaceSpecification const& modifications)
109
if (modifications.name.is_set())
110
surface->rename(modifications.name.value());
114
void msh::DefaultWindowManager::remove_surface(
115
std::shared_ptr<scene::Session> const& /*session*/,
116
std::weak_ptr<scene::Surface> const& /*surface*/)
120
void msh::DefaultWindowManager::add_display(geometry::Rectangle const& /*area*/)
124
void msh::DefaultWindowManager::remove_display(geometry::Rectangle const& /*area*/)
128
bool msh::DefaultWindowManager::handle_keyboard_event(MirKeyboardEvent const* /*event*/)
133
bool msh::DefaultWindowManager::handle_touch_event(MirTouchEvent const* /*event*/)
138
bool msh::DefaultWindowManager::handle_pointer_event(MirPointerEvent const* /*event*/)
143
int msh::DefaultWindowManager::set_surface_attribute(
144
std::shared_ptr<scene::Session> const& /*session*/,
145
std::shared_ptr<scene::Surface> const& surface,
146
MirSurfaceAttrib attrib,
149
return surface->configure(attrib, value);