32
33
msh::AbstractShell::AbstractShell(
33
34
std::shared_ptr<InputTargeter> const& input_targeter,
34
std::shared_ptr<scene::SurfaceCoordinator> const& surface_coordinator,
35
std::shared_ptr<scene::SessionCoordinator> const& session_coordinator,
36
std::shared_ptr<scene::PromptSessionManager> const& prompt_session_manager) :
35
std::shared_ptr<ms::SurfaceCoordinator> const& surface_coordinator,
36
std::shared_ptr<ms::SessionCoordinator> const& session_coordinator,
37
std::shared_ptr<ms::PromptSessionManager> const& prompt_session_manager,
38
std::function<std::shared_ptr<shell::WindowManager>(FocusController* focus_controller)> const& wm_builder) :
37
39
input_targeter(input_targeter),
38
40
surface_coordinator(surface_coordinator),
39
41
session_coordinator(session_coordinator),
40
prompt_session_manager(prompt_session_manager)
42
prompt_session_manager(prompt_session_manager),
43
window_manager(wm_builder(this))
59
64
prompt_session_manager->remove_session(session);
60
65
session_coordinator->close_session(session);
66
window_manager->remove_session(session);
63
69
mf::SurfaceId msh::AbstractShell::create_surface(
64
70
std::shared_ptr<ms::Session> const& session,
65
71
ms::SurfaceCreationParameters const& params)
67
return session->create_surface(params);
73
auto const build = [this](std::shared_ptr<ms::Session> const& session, ms::SurfaceCreationParameters const& placed_params)
75
return session->create_surface(placed_params);
78
return window_manager->add_surface(session, params, build);
81
void msh::AbstractShell::modify_surface(std::shared_ptr<scene::Session> const& session, std::shared_ptr<scene::Surface> const& surface, SurfaceSpecification const& modifications)
83
window_manager->modify_surface(session, surface, modifications);
70
86
void msh::AbstractShell::destroy_surface(
71
87
std::shared_ptr<ms::Session> const& session,
72
88
mf::SurfaceId surface)
90
window_manager->remove_surface(session, session->surface(surface));
74
91
session->destroy_surface(surface);
77
void msh::AbstractShell::handle_surface_created(
78
std::shared_ptr<ms::Session> const& /*session*/)
82
94
std::shared_ptr<ms::PromptSession> msh::AbstractShell::start_prompt_session_for(
83
95
std::shared_ptr<ms::Session> const& session,
84
96
scene::PromptSessionCreationParameters const& params)
102
114
int msh::AbstractShell::set_surface_attribute(
103
std::shared_ptr<ms::Session> const& /*session*/,
115
std::shared_ptr<ms::Session> const& session,
104
116
std::shared_ptr<ms::Surface> const& surface,
105
117
MirSurfaceAttrib attrib,
108
return surface->configure(attrib, value);
120
return window_manager->set_surface_attribute(session, surface, attrib, value);
111
123
int msh::AbstractShell::get_surface_attribute(
119
void msh::AbstractShell::focus_next()
131
void msh::AbstractShell::focus_next_session()
121
133
std::unique_lock<std::mutex> lock(focus_mutex);
122
auto focus = focus_session.lock();
124
focus = session_coordinator->successor_of(focus);
126
set_focus_to_locked(lock, focus);
134
auto session = focus_session.lock();
136
session = session_coordinator->successor_of(session);
138
std::shared_ptr<ms::Surface> surface;
141
surface = session->default_surface();
143
set_focus_to_locked(lock, session, surface);
129
std::weak_ptr<ms::Session> msh::AbstractShell::focussed_application() const
146
std::shared_ptr<ms::Session> msh::AbstractShell::focused_session() const
131
148
std::unique_lock<std::mutex> lg(focus_mutex);
132
return focus_session;
149
return focus_session.lock();
152
std::shared_ptr<ms::Surface> msh::AbstractShell::focused_surface() const
154
std::unique_lock<std::mutex> lock(focus_mutex);
155
return focus_surface.lock();
135
158
void msh::AbstractShell::set_focus_to(
136
std::shared_ptr<scene::Session> const& focus)
159
std::shared_ptr<ms::Session> const& focus_session,
160
std::shared_ptr<ms::Surface> const& focus_surface)
138
std::unique_lock<std::mutex> lg(focus_mutex);
139
set_focus_to_locked(lg, focus);
162
std::unique_lock<std::mutex> lock(focus_mutex);
164
set_focus_to_locked(lock, focus_session, focus_surface);
142
167
void msh::AbstractShell::set_focus_to_locked(
143
168
std::unique_lock<std::mutex> const& /*lock*/,
169
std::shared_ptr<ms::Session> const& session,
144
170
std::shared_ptr<ms::Surface> const& surface)
146
setting_focus_to(surface);
150
// Ensure the surface has really taken the focus before notifying it that it is focused
151
surface->take_input_focus(input_targeter);
152
if (auto current_focus = focus_surface.lock())
153
current_focus->configure(mir_surface_attrib_focus, mir_surface_unfocused);
155
surface->configure(mir_surface_attrib_focus, mir_surface_focused);
156
focus_surface = surface;
174
auto current_focus = focus_surface.lock();
176
if (surface != current_focus)
178
// Ensure the surface has really taken the focus before notifying it that it is focused
179
input_targeter->set_focus(surface);
181
current_focus->configure(mir_surface_attrib_focus, mir_surface_unfocused);
183
surface->configure(mir_surface_attrib_focus, mir_surface_focused);
184
focus_surface = surface;
160
input_targeter->focus_cleared();
189
input_targeter->clear_focus();
164
void msh::AbstractShell::set_focus_to_locked(
165
std::unique_lock<std::mutex> const& lock,
166
std::shared_ptr<ms::Session> const& session)
168
setting_focus_to(session);
170
auto old_focus = focus_session.lock();
172
std::shared_ptr<ms::Surface> surface;
175
surface = session->default_surface();
177
set_focus_to_locked(lock, surface);
179
192
focus_session = session;
191
void msh::AbstractShell::setting_focus_to(std::shared_ptr<ms::Surface> const& /*surface*/)
195
void msh::AbstractShell::setting_focus_to(std::shared_ptr<ms::Session> const& /*session*/)
204
void msh::AbstractShell::add_display(geometry::Rectangle const& area)
206
window_manager->add_display(area);
209
void msh::AbstractShell::remove_display(geometry::Rectangle const& area)
211
window_manager->remove_display(area);
214
bool msh::AbstractShell::handle(MirEvent const& event)
216
if (mir_event_get_type(&event) != mir_event_type_input)
219
auto const input_event = mir_event_get_input_event(&event);
221
switch (mir_input_event_get_type(input_event))
223
case mir_input_event_type_key:
224
return window_manager->handle_keyboard_event(mir_input_event_get_keyboard_event(input_event));
226
case mir_input_event_type_touch:
227
return window_manager->handle_touch_event(mir_input_event_get_touch_event(input_event));
229
case mir_input_event_type_pointer:
230
return window_manager->handle_pointer_event(mir_input_event_get_pointer_event(input_event));
236
auto msh::AbstractShell::surface_at(geometry::Point cursor) const
237
-> std::shared_ptr<scene::Surface>
239
return surface_coordinator->surface_at(cursor);
242
void msh::AbstractShell::raise(SurfaceSet const& surfaces)
244
surface_coordinator->raise(surfaces);