16
16
* Authored by: Robert Carr <racarr@canonical.com>
19
#define MIR_INCLUDE_DEPRECATED_EVENT_HEADER
21
19
#include "application_session.h"
22
20
#include "snapshot_strategy.h"
23
21
#include "default_session_container.h"
22
#include "surfaceless_buffer_stream.h"
25
24
#include "mir/scene/surface.h"
26
25
#include "mir/scene/surface_event_source.h"
27
26
#include "mir/scene/surface_coordinator.h"
28
27
#include "mir/scene/surface_creation_parameters.h"
29
28
#include "mir/scene/session_listener.h"
29
#include "mir/scene/buffer_stream_factory.h"
30
30
#include "mir/events/event_builders.h"
31
31
#include "mir/frontend/event_sink.h"
47
47
ms::ApplicationSession::ApplicationSession(
48
48
std::shared_ptr<ms::SurfaceCoordinator> const& surface_coordinator,
49
std::shared_ptr<ms::BufferStreamFactory> const& buffer_stream_factory,
50
51
std::string const& session_name,
51
52
std::shared_ptr<SnapshotStrategy> const& snapshot_strategy,
52
53
std::shared_ptr<SessionListener> const& session_listener,
53
54
std::shared_ptr<mf::EventSink> const& sink) :
54
55
surface_coordinator(surface_coordinator),
56
buffer_stream_factory(buffer_stream_factory),
56
58
session_name(session_name),
57
59
snapshot_strategy(snapshot_strategy),
65
67
ms::ApplicationSession::~ApplicationSession()
67
std::unique_lock<std::mutex> lock(surfaces_mutex);
69
std::unique_lock<std::mutex> lock(surfaces_and_streams_mutex);
68
70
for (auto const& pair_id_surface : surfaces)
70
72
session_listener->destroying_surface(*this, pair_id_surface.second);
125
127
std::shared_ptr<ms::Surface> ms::ApplicationSession::surface(mf::SurfaceId id) const
127
std::unique_lock<std::mutex> lock(surfaces_mutex);
129
std::unique_lock<std::mutex> lock(surfaces_and_streams_mutex);
129
131
return checked_find(id)->second;
134
std::shared_ptr<ms::Surface> ms::ApplicationSession::surface_after(std::shared_ptr<ms::Surface> const& before) const
136
std::lock_guard<std::mutex> lock(surfaces_and_streams_mutex);
137
auto i = surfaces.begin();
138
for (; i != surfaces.end(); ++i)
140
if (i->second == before)
143
if (i == surfaces.end())
144
BOOST_THROW_EXCEPTION(std::runtime_error("surface_after: surface is not a member of this session"));
146
i = std::find_if(++i, end(surfaces), [](Surfaces::value_type const& s)
148
switch (s.second->type())
150
case mir_surface_type_normal: /**< AKA "regular" */
151
case mir_surface_type_utility: /**< AKA "floating" */
152
case mir_surface_type_dialog:
153
case mir_surface_type_satellite: /**< AKA "toolbox"/"toolbar" */
154
case mir_surface_type_freestyle:
155
case mir_surface_type_menu:
156
case mir_surface_type_inputmethod: /**< AKA "OSK" or handwriting etc. */
159
case mir_surface_type_gloss:
160
case mir_surface_type_tip: /**< AKA "tooltip" */
162
// Cannot have input focus - skip it
167
if (i == surfaces.end())
168
i = surfaces.begin();
132
173
void ms::ApplicationSession::take_snapshot(SnapshotCallback const& snapshot_taken)
134
175
if (auto surface = default_surface())
140
181
std::shared_ptr<ms::Surface> ms::ApplicationSession::default_surface() const
142
std::unique_lock<std::mutex> lock(surfaces_mutex);
183
std::unique_lock<std::mutex> lock(surfaces_and_streams_mutex);
144
185
if (surfaces.size())
145
186
return surfaces.begin()->second;
150
191
void ms::ApplicationSession::destroy_surface(mf::SurfaceId id)
152
std::unique_lock<std::mutex> lock(surfaces_mutex);
193
std::unique_lock<std::mutex> lock(surfaces_and_streams_mutex);
153
194
auto p = checked_find(id);
154
195
auto const surface = p->second;
174
215
void ms::ApplicationSession::force_requests_to_complete()
176
std::unique_lock<std::mutex> lock(surfaces_mutex);
217
std::unique_lock<std::mutex> lock(surfaces_and_streams_mutex);
177
218
for (auto& id_s : surfaces)
179
220
id_s.second->force_requests_to_complete();
229
270
start_prompt_session();
273
std::shared_ptr<mf::BufferStream> ms::ApplicationSession::get_buffer_stream(mf::BufferStreamId id) const
275
std::unique_lock<std::mutex> lock(surfaces_and_streams_mutex);
277
auto p = streams.find(id);
278
if (p == streams.end())
279
return checked_find(mf::SurfaceId(id.as_value()))->second;
284
mf::BufferStreamId ms::ApplicationSession::create_buffer_stream(mg::BufferProperties const& props)
286
auto const id = static_cast<mf::BufferStreamId>(next_id().as_value());
287
auto stream = std::make_shared<ms::SurfacelessBufferStream>(buffer_stream_factory->create_buffer_stream(2, props));
290
std::unique_lock<std::mutex> lock(surfaces_and_streams_mutex);
291
streams[id] = stream;
297
void ms::ApplicationSession::destroy_buffer_stream(mf::BufferStreamId id)
299
std::unique_lock<std::mutex> lock(surfaces_and_streams_mutex);
300
auto p = streams.find(id);
301
if (p == streams.end())
302
BOOST_THROW_EXCEPTION(std::runtime_error("Invalid buffer stream id"));
303
auto const stream = p->second;