21
21
#include "session_container.h"
22
22
#include "mir/scene/surface.h"
23
23
#include "mir/scene/surface_coordinator.h"
24
#include "mir/shell/focus_setter.h"
25
24
#include "mir/scene/session.h"
26
25
#include "mir/scene/session_listener.h"
27
26
#include "mir/scene/prompt_session.h"
42
41
ms::SessionManager::SessionManager(std::shared_ptr<SurfaceCoordinator> const& surface_factory,
43
42
std::shared_ptr<SessionContainer> const& container,
44
std::shared_ptr<msh::FocusSetter> const& focus_setter,
45
43
std::shared_ptr<SnapshotStrategy> const& snapshot_strategy,
46
44
std::shared_ptr<SessionEventSink> const& session_event_sink,
47
45
std::shared_ptr<SessionListener> const& session_listener,
48
46
std::shared_ptr<PromptSessionManager> const& prompt_session_manager) :
49
47
surface_coordinator(surface_factory),
50
48
app_container(container),
51
focus_setter(focus_setter),
52
49
snapshot_strategy(snapshot_strategy),
53
50
session_event_sink(session_event_sink),
54
51
session_listener(session_listener),
94
90
session_listener->starting(new_session);
96
set_focus_to(new_session);
98
92
return new_session;
101
inline void ms::SessionManager::set_focus_to_locked(std::unique_lock<std::mutex> const&, std::shared_ptr<Session> const& session)
103
auto old_focus = focus_application.lock();
105
focus_application = session;
107
focus_setter->set_focus_to(session);
110
session_event_sink->handle_focus_change(session);
111
session_listener->focused(session);
115
session_event_sink->handle_no_focus();
116
session_listener->unfocused();
120
95
void ms::SessionManager::set_focus_to(std::shared_ptr<Session> const& session)
122
std::unique_lock<std::mutex> lg(mutex);
123
set_focus_to_locked(lg, session);
126
void ms::SessionManager::close_session(std::shared_ptr<mf::Session> const& session)
97
session_event_sink->handle_focus_change(session);
98
session_listener->focused(session);
101
void ms::SessionManager::unset_focus()
103
session_event_sink->handle_no_focus();
104
session_listener->unfocused();
107
void ms::SessionManager::close_session(std::shared_ptr<Session> const& session)
128
109
auto scene_session = std::dynamic_pointer_cast<Session>(session);
136
117
session_listener->stopping(scene_session);
138
119
app_container->remove_session(scene_session);
140
std::unique_lock<std::mutex> lock(mutex);
141
set_focus_to_locked(lock, app_container->successor_of(std::shared_ptr<Session>()));
144
void ms::SessionManager::focus_next()
146
std::unique_lock<std::mutex> lock(mutex);
147
auto focus = focus_application.lock();
150
focus = app_container->successor_of(std::shared_ptr<Session>());
154
focus = app_container->successor_of(focus);
156
set_focus_to_locked(lock, focus);
159
std::weak_ptr<ms::Session> ms::SessionManager::focussed_application() const
161
return focus_application;
164
void ms::SessionManager::handle_surface_created(std::shared_ptr<mf::Session> const& session)
166
set_focus_to(std::dynamic_pointer_cast<Session>(session));
169
std::shared_ptr<mf::PromptSession> ms::SessionManager::start_prompt_session_for(std::shared_ptr<mf::Session> const& session,
122
std::shared_ptr<ms::PromptSession> ms::SessionManager::start_prompt_session_for(std::shared_ptr<Session> const& session,
170
123
PromptSessionCreationParameters const& params)
172
125
auto shell_session = std::dynamic_pointer_cast<Session>(session);
179
132
void ms::SessionManager::add_prompt_provider_for(
180
std::shared_ptr<mf::PromptSession> const& prompt_session,
181
std::shared_ptr<frontend::Session> const& session)
133
std::shared_ptr<PromptSession> const& prompt_session,
134
std::shared_ptr<Session> const& session)
183
136
auto scene_prompt_session = std::dynamic_pointer_cast<PromptSession>(prompt_session);
184
137
auto scene_session = std::dynamic_pointer_cast<Session>(session);
186
139
prompt_session_manager->add_prompt_provider(scene_prompt_session, scene_session);
189
void ms::SessionManager::stop_prompt_session(std::shared_ptr<mf::PromptSession> const& prompt_session)
142
void ms::SessionManager::stop_prompt_session(std::shared_ptr<PromptSession> const& prompt_session)
191
144
auto scene_prompt_session = std::dynamic_pointer_cast<PromptSession>(prompt_session);
192
145
prompt_session_manager->stop_prompt_session(scene_prompt_session);
195
mf::SurfaceId ms::SessionManager::create_surface(std::shared_ptr<mf::Session> const& session, scene::SurfaceCreationParameters const& params)
197
// TODO this downcasting is clunky, but is temporary wiring of the new interaction route to the old implementation
198
if (auto const sess = std::dynamic_pointer_cast<Session>(session))
200
return sess->create_surface(params);
203
BOOST_THROW_EXCEPTION(std::logic_error("invalid session"));
206
void ms::SessionManager::destroy_surface(std::shared_ptr<mf::Session> const& session, mf::SurfaceId surface)
208
// TODO this downcasting is clunky, but is temporary wiring of the new interaction route to the old implementation
209
if (auto const sess = std::dynamic_pointer_cast<Session>(session))
211
return sess->destroy_surface(surface);
214
BOOST_THROW_EXCEPTION(std::logic_error("invalid session"));
217
int ms::SessionManager::set_surface_attribute(
218
std::shared_ptr<mf::Session> const& session,
219
mf::SurfaceId surface_id,
220
MirSurfaceAttrib attrib,
223
// TODO this downcasting is clunky, but is temporary wiring of the new interaction route to the old implementation
225
BOOST_THROW_EXCEPTION(std::logic_error("invalid session"));
227
auto const surface = std::dynamic_pointer_cast<Surface>(session->get_surface(surface_id));
230
BOOST_THROW_EXCEPTION(std::logic_error("invalid surface id"));
232
return surface->configure(attrib, value);
235
int ms::SessionManager::get_surface_attribute(
236
std::shared_ptr<mf::Session> const& session,
237
mf::SurfaceId surface_id,
238
MirSurfaceAttrib attrib)
240
// TODO this downcasting is clunky, but is temporary wiring of the new interaction route to the old implementation
242
BOOST_THROW_EXCEPTION(std::logic_error("invalid session"));
244
auto const surface = std::dynamic_pointer_cast<Surface>(session->get_surface(surface_id));
247
BOOST_THROW_EXCEPTION(std::logic_error("invalid surface id"));
249
return surface->query(attrib);
148
std::shared_ptr<ms::Session> ms::SessionManager::successor_of(
149
std::shared_ptr<Session> const& session) const
151
return app_container->successor_of(session);