Phosphor
Qt6 / Wayland library suite for window-management tools
 
Loading...
Searching...
No Matches
PhosphorLayer::ScreenSurfaceRegistry< SurfaceT > Class Template Reference

Per-screen bookkeeping for surfaces with AllScreens affinity. More...

#include <phosphor-layer/include/PhosphorLayer/ScreenSurfaceRegistry.h>

Public Types

using Builder = std::function< SurfaceT *(QScreen *)>
 Per-screen builder.
 

Public Member Functions

 ScreenSurfaceRegistry (SurfaceFactory *factory, IScreenProvider *screens)
 
 ~ScreenSurfaceRegistry ()
 
 ScreenSurfaceRegistry (const ScreenSurfaceRegistry &)=delete
 
ScreenSurfaceRegistryoperator= (const ScreenSurfaceRegistry &)=delete
 
QList< SurfaceT * > createForAllScreens (Builder builder)
 Create one Surface per screen reported by the provider.
 
void syncToScreens (Builder builder)
 Diff-sync against the provider's current screen list.
 
void clear ()
 Drop all tracked surfaces (deleteLater on each, clear map).
 
void adoptSurface (QScreen *screen, SurfaceT *surface)
 Register an externally-created Surface under screen.
 
SurfaceT * surfaceForScreen (QScreen *screen) const
 
QList< SurfaceT * > surfaces () const
 
SurfaceFactoryfactory () const noexcept
 
IScreenProviderscreenProvider () const noexcept
 

Detailed Description

template<typename SurfaceT = Surface>
class PhosphorLayer::ScreenSurfaceRegistry< SurfaceT >

Per-screen bookkeeping for surfaces with AllScreens affinity.

Template parameter lets consumers subclass Surface and keep their type through the API:

class PzOverlaySurface : public Surface { ... };
auto* s = reg.surfaceForScreen(myScreen); // typed as PzOverlaySurface*
Per-screen bookkeeping for surfaces with AllScreens affinity.
Definition ScreenSurfaceRegistry.h:55
SurfaceFactory * factory() const noexcept
Definition ScreenSurfaceRegistry.h:118
One layer-shell surface with a managed lifecycle.
Definition Surface.h:99

The registry does NOT listen to screensChanged itself — that is the TopologyCoordinator's job. Consumers that want topology response wire a coordinator to one or more registries.

Header-only: the template instantiation is trivially small and keeping it inline lets consumer subclasses bind their type without generating library exports for every combination.

Note
Status (v0.1): not yet used by the reference consumer (PlasmaZones OverlayService, which tracks per-screen state in its own QHash keyed by virtual-screen id). The registry is a public primitive for consumers whose per-screen state maps cleanly to physical QScreen*. Its API is covered by unit tests but has no production integration yet; treat behavioural details (QHash iteration order, pointer identity across createForAllScreens calls) as subject to change until the first real consumer lands.

Member Typedef Documentation

◆ Builder

template<typename SurfaceT = Surface>
using PhosphorLayer::ScreenSurfaceRegistry< SurfaceT >::Builder = std::function<SurfaceT*(QScreen*)>

Per-screen builder.

Receives the target screen; returns a new Surface (or subclass) bound to it. Nullptr return is permitted — the registry skips that screen without logging.

Constructor & Destructor Documentation

◆ ScreenSurfaceRegistry() [1/2]

template<typename SurfaceT = Surface>
PhosphorLayer::ScreenSurfaceRegistry< SurfaceT >::ScreenSurfaceRegistry ( SurfaceFactory factory,
IScreenProvider screens 
)
inline

◆ ~ScreenSurfaceRegistry()

template<typename SurfaceT = Surface>
PhosphorLayer::ScreenSurfaceRegistry< SurfaceT >::~ScreenSurfaceRegistry ( )
inline

◆ ScreenSurfaceRegistry() [2/2]

template<typename SurfaceT = Surface>
PhosphorLayer::ScreenSurfaceRegistry< SurfaceT >::ScreenSurfaceRegistry ( const ScreenSurfaceRegistry< SurfaceT > &  )
delete

Member Function Documentation

◆ adoptSurface()

template<typename SurfaceT >
void PhosphorLayer::ScreenSurfaceRegistry< SurfaceT >::adoptSurface ( QScreen *  screen,
SurfaceT *  surface 
)

Register an externally-created Surface under screen.

Useful when a consumer subclasses Surface and constructs it itself.

Ownership: the registry becomes the owner-of-record for the adopted surface. clear() / syncToScreens will schedule deleteLater() on the stored pointer. QPointer's auto-nulling + Qt's DeferredDelete coalescing make this safe even when the surface is ALSO reachable through a parent QObject that's about to destroy it — the second delete-event becomes a no-op.

If screen already has a registered surface, the prior surface is scheduled for deletion unless it is the same object as surface (re-adopt is an idempotent no-op).

◆ clear()

template<typename SurfaceT >
void PhosphorLayer::ScreenSurfaceRegistry< SurfaceT >::clear ( )

Drop all tracked surfaces (deleteLater on each, clear map).

◆ createForAllScreens()

template<typename SurfaceT >
QList< SurfaceT * > PhosphorLayer::ScreenSurfaceRegistry< SurfaceT >::createForAllScreens ( Builder  builder)

Create one Surface per screen reported by the provider.

Takes a Builder because SurfaceConfig is move-only (contentItem) and per-screen context often differs (screen name, geometry, etc.). Passing a builder is strictly more flexible than cloning a single config, and gives the consumer a natural place to inject per-screen context properties.

Idempotent: re-running with the same screen set is a no-op. Screens that already have an entry keep their existing surface; new screens get a freshly-built one.

◆ factory()

template<typename SurfaceT = Surface>
SurfaceFactory * PhosphorLayer::ScreenSurfaceRegistry< SurfaceT >::factory ( ) const
inlinenoexcept

◆ operator=()

template<typename SurfaceT = Surface>
ScreenSurfaceRegistry & PhosphorLayer::ScreenSurfaceRegistry< SurfaceT >::operator= ( const ScreenSurfaceRegistry< SurfaceT > &  )
delete

◆ screenProvider()

template<typename SurfaceT = Surface>
IScreenProvider * PhosphorLayer::ScreenSurfaceRegistry< SurfaceT >::screenProvider ( ) const
inlinenoexcept

◆ surfaceForScreen()

template<typename SurfaceT >
SurfaceT * PhosphorLayer::ScreenSurfaceRegistry< SurfaceT >::surfaceForScreen ( QScreen *  screen) const

◆ surfaces()

template<typename SurfaceT >
QList< SurfaceT * > PhosphorLayer::ScreenSurfaceRegistry< SurfaceT >::surfaces ( ) const

◆ syncToScreens()

template<typename SurfaceT >
void PhosphorLayer::ScreenSurfaceRegistry< SurfaceT >::syncToScreens ( Builder  builder)

Diff-sync against the provider's current screen list.

Destroys surfaces for removed screens; calls builder for newly-added ones. Emits no signals — consumers listen to their surfaces directly.


The documentation for this class was generated from the following file: