9#include <PhosphorLayer/phosphorlayer_export.h>
53template<
typename SurfaceT = Surface>
56 static_assert(std::is_base_of_v<Surface, SurfaceT>,
"SurfaceT must derive from PhosphorLayer::Surface");
62 using Builder = std::function<SurfaceT*(QScreen*)>;
130 QHash<QScreen*, QPointer<SurfaceT>> m_entries;
135template<
typename SurfaceT>
138 QList<SurfaceT*> out;
142 const auto list = m_screens->
screens();
143 out.reserve(list.size());
144 for (QScreen* s : list) {
145 auto it = m_entries.find(s);
146 if (it != m_entries.end()) {
147 if (SurfaceT* live = it.value().data()) {
156 SurfaceT* surface = builder ? builder(s) :
nullptr;
158 m_entries.insert(s, QPointer<SurfaceT>(surface));
165template<
typename SurfaceT>
171 const auto current = m_screens->screens();
172 const QSet<QScreen*> currentSet(current.begin(), current.end());
185 for (
auto it = m_entries.begin(); it != m_entries.end();) {
186 if (!currentSet.contains(it.key())) {
187 if (SurfaceT* s = it.value().data()) {
190 it = m_entries.erase(it);
191 }
else if (!it.value().data()) {
192 it = m_entries.erase(it);
198 for (QScreen* s : current) {
199 if (m_entries.contains(s) && m_entries.value(s).data()) {
202 SurfaceT* surface = builder ? builder(s) :
nullptr;
204 m_entries.insert(s, QPointer<SurfaceT>(surface));
209template<
typename SurfaceT>
212 for (
auto it = m_entries.begin(); it != m_entries.end(); ++it) {
213 if (SurfaceT* s = it.value().data()) {
220template<
typename SurfaceT>
226 const auto existing = m_entries.constFind(screen);
227 if (existing != m_entries.constEnd()) {
228 if (SurfaceT* prior = existing.value().data()) {
229 if (prior != surface) {
230 prior->deleteLater();
234 m_entries.insert(screen, QPointer<SurfaceT>(surface));
237template<
typename SurfaceT>
240 const auto it = m_entries.constFind(screen);
241 return (it != m_entries.constEnd()) ? it.value().data() :
nullptr;
244template<
typename SurfaceT>
247 QList<SurfaceT*> out;
248 out.reserve(m_entries.size());
249 for (
auto it = m_entries.constBegin(); it != m_entries.constEnd(); ++it) {
250 if (SurfaceT* s = it.value().data()) {
Source-of-truth interface for the available QScreen set.
Definition IScreenProvider.h:62
virtual QList< QScreen * > screens() const =0
Full list of screens the surfaces should be aware of.
Per-screen bookkeeping for surfaces with AllScreens affinity.
Definition ScreenSurfaceRegistry.h:55
~ScreenSurfaceRegistry()
Definition ScreenSurfaceRegistry.h:69
QList< SurfaceT * > surfaces() const
Definition ScreenSurfaceRegistry.h:245
SurfaceT * surfaceForScreen(QScreen *screen) const
Definition ScreenSurfaceRegistry.h:238
void adoptSurface(QScreen *screen, SurfaceT *surface)
Register an externally-created Surface under screen.
Definition ScreenSurfaceRegistry.h:221
void syncToScreens(Builder builder)
Diff-sync against the provider's current screen list.
Definition ScreenSurfaceRegistry.h:166
IScreenProvider * screenProvider() const noexcept
Definition ScreenSurfaceRegistry.h:122
std::function< SurfaceT *(QScreen *)> Builder
Per-screen builder.
Definition ScreenSurfaceRegistry.h:62
ScreenSurfaceRegistry(SurfaceFactory *factory, IScreenProvider *screens)
Definition ScreenSurfaceRegistry.h:64
SurfaceFactory * factory() const noexcept
Definition ScreenSurfaceRegistry.h:118
ScreenSurfaceRegistry & operator=(const ScreenSurfaceRegistry &)=delete
QList< SurfaceT * > createForAllScreens(Builder builder)
Create one Surface per screen reported by the provider.
Definition ScreenSurfaceRegistry.h:136
ScreenSurfaceRegistry(const ScreenSurfaceRegistry &)=delete
void clear()
Drop all tracked surfaces (deleteLater on each, clear map).
Definition ScreenSurfaceRegistry.h:210
Stateless constructor for Surfaces.
Definition SurfaceFactory.h:35
Definition SurfaceAnimator.h:26
constexpr const char * Surface
Definition LayerSurface.h:21