namespace
{
{
public:
SceneTracker(std::shared_ptr<me::WindowManager> const& window_manager) :
window_manager(window_manager)
{
}
private:
void starting(std::shared_ptr<ms::Session>
const& session)
override
{
window_manager->add_session(session);
}
void stopping(std::shared_ptr<ms::Session>
const& session)
override
{
window_manager->remove_session(session);
}
void focused(std::shared_ptr<ms::Session> const& ) override {}
void unfocused() override {}
void surface_created(
ms::Session& session, std::shared_ptr<ms::Surface>
const& surface)
override
{
window_manager->add_surface(surface, &session);
}
void destroying_surface(
ms::Session& session, std::shared_ptr<ms::Surface>
const& surface)
override
{
window_manager->remove_surface(surface, &session);
}
std::shared_ptr<me::WindowManager> const window_manager;
};
{
public:
DisplayTracker(
std::unique_ptr<mc::DisplayBufferCompositor>&& wrapped,
std::shared_ptr<me::WindowManager> const& window_manager) :
wrapped{std::move(wrapped)},
area{area},
window_manager(window_manager)
{
window_manager->add_display(area);
}
~DisplayTracker() noexcept
{
window_manager->remove_display(area);
}
private:
{
wrapped->composite(std::move(scene_sequence));
}
std::unique_ptr<mc::DisplayBufferCompositor> const wrapped;
std::shared_ptr<me::WindowManager> const window_manager;
};
{
public:
DisplayTrackerFactory(
std::shared_ptr<mc::DisplayBufferCompositorFactory> const& wrapped,
std::shared_ptr<me::WindowManager> const& window_manager) :
wrapped{wrapped},
window_manager(window_manager)
{
}
private:
std::unique_ptr<mc::DisplayBufferCompositor> create_compositor_for(
mg::DisplayBuffer& display_buffer)
{
auto compositor = wrapped->create_compositor_for(display_buffer);
return std::unique_ptr<mc::DisplayBufferCompositor>{
new DisplayTracker{std::move(compositor), display_buffer.
view_area(), window_manager}};
}
std::shared_ptr<mc::DisplayBufferCompositorFactory> const wrapped;
std::shared_ptr<me::WindowManager> const window_manager;
};
}
{
auto const factory = std::make_shared<me::WindowManagmentFactory>(server);
server.override_the_placement_strategy([factory, &server]()
-> std::shared_ptr<ms::PlacementStrategy>
{
auto const options = server.get_options();
return std::shared_ptr<ms::PlacementStrategy>{};
return factory->window_manager();
});
server.override_the_session_listener([factory, &server]()
-> std::shared_ptr<ms::SessionListener>
{
auto const options = server.get_options();
return std::shared_ptr<ms::SessionListener>{};
return std::make_shared<SceneTracker>(factory->window_manager());
});
server.override_the_surface_configurator([factory, &server]()
-> std::shared_ptr<ms::SurfaceConfigurator>
{
auto const options = server.get_options();
return std::shared_ptr<ms::SurfaceConfigurator>{};
return factory->window_manager();
});
server.wrap_display_buffer_compositor_factory([factory, &server]
(std::shared_ptr<mc::DisplayBufferCompositorFactory> const& wrapped)
-> std::shared_ptr<mc::DisplayBufferCompositorFactory>
{
auto const options = server.get_options();
return wrapped;
return std::make_shared<DisplayTrackerFactory>(wrapped, factory->window_manager());
});
}