6#include <phosphorplacement_export.h>
88 QObject* parent =
nullptr);
116 m_windowRegistry = registry;
164 m_shouldTrackPredicate = std::move(predicate);
178 m_snapEngine = engine;
183 return m_snapEngine.data();
191 return m_windowRegistry;
196 return m_screenManager;
211 int virtualDesktop)
override;
221 int virtualDesktop)
override;
284 const QString& currentScreenName)
const;
298 bool exactOnly =
false)
const override;
424 int virtualDesktop)
override;
538 QRect
zoneGeometry(
const QString& zoneId,
const QString& screenId = QString())
const override;
568 const QSet<QString>& includeScreens = {},
int desktopFilter = 0);
578 m_resnapBuffer.clear();
743 return m_pendingRestoreQueues;
748 return std::exchange(m_resnapBuffer, {});
764 const QHash<QString, int>& desktops);
771 m_pendingRestoreQueues = queues;
782 void setLastUsedZone(
const QString& zoneId,
const QString& screenId,
const QString& zoneClass,
int desktop);
789 m_floatingWindows = windows;
827 DirtyActiveLayoutId = 1u << 0,
828 DirtyZoneAssignments = 1u << 1,
829 DirtyPendingRestores = 1u << 2,
830 DirtyPreTileGeometries = 1u << 3,
831 DirtyLastUsedZone = 1u << 4,
832 DirtyPreFloatZones = 1u << 5,
833 DirtyPreFloatScreens = 1u << 6,
834 DirtyUserSnapped = 1u << 7,
835 DirtyAutotileOrders = 1u << 8,
836 DirtyAutotilePending = 1u << 9,
879 static constexpr int MinVisibleWidth = 100;
880 static constexpr int MinVisibleHeight = 100;
891 void scheduleSaveState(
DirtyMask fields = DirtyAll);
892 bool isGeometryOnScreen(
const QRect& geometry)
const;
893 QRect adjustGeometryToScreen(
const QRect& geometry)
const;
897 template<
typename Func>
898 auto preFloatLookup(
const QString& windowId, Func&& getter)
const ->
decltype(getter(windowId));
901 void validateLastUsedZone(
const QString& targetScreen);
905 static QString findNearestVirtualScreen(
const QStringList& vsIds,
int oldIndex);
909 struct ZoneLookupResult
914 ZoneLookupResult findZoneInAllLayouts(
const QUuid& zoneUuid)
const;
926 int desktopFilter = 0)
const override;
941 QSet<QUuid>
buildOccupiedZoneSet(
const QString& screenFilter = QString(),
int desktopFilter = 0)
const override;
973 QPointer<PhosphorEngine::PlacementEngineBase> m_snapEngine;
977 QSet<QString> m_floatingWindows;
980 QHash<QString, QList<PendingRestore>> m_pendingRestoreQueues;
992 QHash<QString, bool> m_windowStickyStates;
994 QVector<ResnapEntry> m_resnapBuffer;
999 DirtyMask m_dirtyMask = DirtyAll;
Definition IWindowTrackingService.h:33
Abstract base class for placement engines.
Definition PlacementEngineBase.h:37
Definition WindowRegistry.h:34
Definition IGeometryResolver.h:17
Window-zone tracking service (business logic layer)
Definition WindowTrackingService.h:79
const QHash< QString, QList< PendingRestore > > & pendingRestoreQueues() const override
Get pending restore queues (consumption queue: appId -> list of pending restores)
Definition WindowTrackingService.h:741
bool consumePendingAssignment(const QString &windowId) override
Pop the oldest pending restore entry for this window's appId.
QString zoneForWindow(const QString &windowId) const override
Get the primary zone ID for a window.
void markDirty(DirtyMask fields)
OR the given fields into the dirty mask AND emit stateChanged.
Phosphor::Screens::ScreenManager * screenManager() const override
Definition WindowTrackingService.h:194
PhosphorProtocol::EmptyZoneList getEmptyZones(const QString &screenId) const
Get typed list of all empty zones for Snap Assist continuation.
void setConfig(const PlacementConfig &config)
Definition WindowTrackingService.h:90
const QHash< QString, QStringList > & zoneAssignments() const override
Get all zone assignments for persistence.
bool isWindowSnapped(const QString &windowId) const override
Check if a window is assigned to any zone.
void assignWindowToZone(const QString &windowId, const QString &zoneId, const QString &screenId, int virtualDesktop) override
Assign a window to a zone.
void clearResnapBuffer()
Clear the resnap buffer.
Definition WindowTrackingService.h:576
void recordSnapIntent(const QString &windowId, bool wasUserInitiated) override
Record that a window class was user-snapped.
QVector< ResnapEntry > takeResnapBuffer() override
Definition WindowTrackingService.h:746
bool isWindowFloating(const QString &windowId) const override
Check if a window is floating (excluded from snapping)
QString findEmptyZoneInLayout(PhosphorZones::Layout *layout, const QString &screenId, int desktopFilter=0) const override
void setFloatingWindows(const QSet< QString > &windows)
Set floating windows (loaded from KConfig by adaptor)
Definition WindowTrackingService.h:787
QString preFloatScreen(const QString &windowId) const override
Get the screen name where the window was snapped before floating.
QStringList buildZoneOrderedWindowList(const QString &screenId) const
Build a zone-ordered window list for a screen from current zone assignments.
bool isWindowSticky(const QString &windowId) const override
Check if window is sticky.
void clearPreFloatZoneForWindow(const QString &windowId)
Clear pre-float zone for a specific window only (not appId)
uint32_t DirtyMask
Definition WindowTrackingService.h:839
DirtyMask peekDirty() const
Return the current dirty mask without clearing.
Definition WindowTrackingService.h:856
void setPreFloatScreenAssignments(const QHash< QString, QString > &assignments)
void clearPreFloatZone(const QString &windowId)
Clear pre-float zone after restore (both windowId and appId keys)
void setSnapEngine(PhosphorEngine::PlacementEngineBase *engine)
Wire the snap-mode placement engine for unmanaged geometry queries.
Definition WindowTrackingService.h:176
QString currentAppIdFor(const QString &anyWindowId) const override
Current app class for a windowId, preferring the live registry.
QSet< QString > physicalScreensWithStaleVirtualAssignments(const QSet< QString > &subdividedPhysicalIds) const
Find physical screens whose state still references virtual ids, excluding screens the caller knows ar...
bool isAutoSnapped(const QString &windowId) const
Check if a window was auto-snapped.
void setPendingRestoreQueues(const QHash< QString, QList< PendingRestore > > &queues)
Set pending restore queues (loaded from KConfig by adaptor)
Definition WindowTrackingService.h:769
void unassignWindow(const QString &windowId) override
Remove window from its assigned zone.
QObject * asQObject() override
Definition WindowTrackingService.h:99
void setPreFloatZoneAssignments(const QHash< QString, QStringList > &assignments)
Set pre-float zone assignments (loaded from KConfig by adaptor)
WindowTrackingService(PhosphorZones::LayoutRegistry *layoutManager, PhosphorZones::IZoneDetector *zoneDetector, Phosphor::Screens::ScreenManager *screenManager, PhosphorWorkspaces::VirtualDesktopManager *vdm, IGeometryResolver *geometryResolver=nullptr, PlacementConfig config={}, QObject *parent=nullptr)
QString preFloatZone(const QString &windowId) const
Get primary zone to restore to when unfloating.
QHash< QString, QRect > updatedWindowGeometries() const
Get updated geometries for all tracked windows.
bool clearAutoSnapped(const QString &windowId) override
Clear auto-snapped flag for a window.
QRect zoneGeometry(const QString &zoneId, const QString &screenId=QString()) const override
Get geometry for a zone on a specific screen.
int pruneStaleAssignments(const QSet< QString > &aliveWindowIds)
Remove zone/screen/desktop assignments for windows not in the alive set.
void populateResnapBufferForAllScreens(const QSet< QString > &excludeScreens={}, const QSet< QString > &includeScreens={}, int desktopFilter=0)
Populate the resnap buffer for all screens independently.
std::optional< QRect > validateGeometryForScreen(const QRect &geo, const QString &savedScreen, const QString ¤tScreenName) const
Validate and adjust a saved geometry for screen-aware restore.
void setActiveAssignments(const QHash< QString, QStringList > &zones, const QHash< QString, QString > &screens, const QHash< QString, int > &desktops)
Set active zone/screen/desktop assignments (loaded from KConfig by adaptor)
QStringList snappedWindows() const
Get all snapped windows.
QString lastUsedZoneId() const
Get last used zone ID.
bool clearFloatingForSnap(const QString &windowId) override
Clear floating state when snapping a floating window.
void assignWindowToZones(const QString &windowId, const QStringList &zoneIds, const QString &screenId, int virtualDesktop) override
Assign a window to multiple zones (multi-zone snap)
QStringList preFloatZones(const QString &windowId) const override
Get all zones to restore to when unfloating (multi-zone support)
DirtyField
Definition WindowTrackingService.h:825
int pruneExcludedPendingRestores(const QStringList &exclusionPatterns)
Drop pending-restore queues whose appId matches any exclusion pattern.
void clearDirty()
Clear every dirty bit.
void windowZoneChanged(const QString &windowId, const QString &zoneId)
QRect resolveZoneGeometry(const QStringList &zoneIds, const QString &screenId) const override
Resolve zone geometry: combined geometry for multi-zone, single for single zone.
void migrateScreenAssignmentsFromVirtual(const QString &physicalScreenId)
Reverse migration: virtual screen IDs → physical screen ID.
const QHash< QString, int > & desktopAssignments() const
Get all desktop assignments for persistence.
QStringList floatingWindows() const
Get all floating window IDs.
PhosphorEngine::WindowRegistry * windowRegistry() const
Accessor for consumers that need direct access (effect, adaptor).
Definition WindowTrackingService.h:189
std::optional< QRect > validatedUnmanagedGeometry(const QString &windowId, const QString &screenId, bool exactOnly=false) const override
Look up unmanaged geometry from the snap engine with appId fallback and validate.
void setLastUsedZone(const QString &zoneId, const QString &screenId, const QString &zoneClass, int desktop)
Set last used zone info (loaded from KConfig by adaptor)
QString canonicalizeForLookup(const QString &rawWindowId) const
Canonicalize for read-only callers (no map mutation).
QHash< QString, PendingRestoreTarget > pendingRestoreGeometries() const
Pre-compute zone geometries for all pending restore entries.
void setShouldTrackPredicate(ShouldTrackPredicate predicate)
Inject a context-active predicate.
Definition WindowTrackingService.h:162
void unsnapForFloat(const QString &windowId) override
Unsnap window for floating (saves zone for later restore)
QString findEmptyZone(const QString &screenId=QString()) const override
Find the first empty zone in the layout for a screen.
DirtyMask takeDirty()
Return the current dirty mask, clearing it atomically.
void setWindowFloating(const QString &windowId, bool floating) override
Set window floating state.
QSet< QUuid > buildOccupiedZoneSet(const QString &screenFilter=QString(), int desktopFilter=0) const override
Build set of occupied zone UUIDs, optionally filtered by screen and virtual desktop.
void updateLastUsedZone(const QString &zoneId, const QString &screenId, const QString &windowClass, int virtualDesktop) override
Update last used zone tracking.
void onLayoutChanged()
Handle layout change - validate/clear stale zone assignments.
QRect multiZoneGeometry(const QStringList &zoneIds, const QString &screenId=QString()) const
Get combined geometry for multiple zones on a specific screen.
const QHash< QString, QString > & preFloatScreenAssignments() const
void setWindowSticky(const QString &windowId, bool sticky)
Record whether a window is sticky (on all desktops)
void setWindowRegistry(PhosphorEngine::WindowRegistry *registry)
Wire up the shared WindowRegistry.
Definition WindowTrackingService.h:114
const QHash< QString, QStringList > & preFloatZoneAssignments() const
Get pre-float zone assignments for persistence.
void setUserSnappedClasses(const QSet< QString > &classes)
Set user-snapped classes (loaded from KConfig by adaptor)
const QHash< QString, QString > & screenAssignments() const override
Get all screen assignments for persistence.
void stateChanged()
Emitted when state needs to be saved.
QStringList windowsInZone(const QString &zoneId) const override
Get all windows in a specific zone.
void windowClosed(const QString &windowId, PhosphorEngine::WindowKind kind=PhosphorEngine::WindowKind::Unknown)
Clean up all tracking data for a closed window.
~WindowTrackingService() override
void setSnapState(PhosphorSnapEngine::SnapState *state)
Definition WindowTrackingService.h:119
const QSet< QString > & userSnappedClasses() const
Get user-snapped classes.
QStringList zonesForWindow(const QString &windowId) const override
Get all zone IDs for a window (multi-zone support)
const PlacementConfig & config() const
Definition WindowTrackingService.h:94
void markAsAutoSnapped(const QString &windowId)
Mark a window as auto-snapped.
void retagLastUsedZoneClass(const QString &newClass)
Update the last-used-zone class tag without touching zone/screen.
PhosphorEngine::PlacementEngineBase * snapEngine() const
Definition WindowTrackingService.h:181
QString lastUsedZoneClass() const
App class string stamped on the last-used-zone tracking.
QString resolveEffectiveScreenId(const QString &screenId) const override
Resolve a screen ID to an effective screen ID, falling back to the physical screen ID if a virtual sc...
std::function< bool(const QString &screenId, int virtualDesktop)> ShouldTrackPredicate
Predicate type for "is this snap-mode context active?".
Definition WindowTrackingService.h:142
void migrateScreenAssignmentsToVirtual(const QString &physicalScreenId, const QStringList &virtualScreenIds, Phosphor::Screens::ScreenManager *mgr)
Migrate window screen assignments from physical to virtual screen IDs.
Per-screen snap placement state.
Definition SnapState.h:32
Definition VirtualDesktopManager.h:17
Abstract interface for zone detection + highlight lifecycle.
Definition IZoneDetector.h:84
Manual zone-layout registry + per-context assignment store.
Definition LayoutRegistry.h:48
Represents a collection of zones that form a layout.
Definition Layout.h:74
Represents a single zone within a layout.
Definition Zone.h:44
Centralized screen-topology service.
Definition Manager.h:75
Definition EngineTypes.h:13
WindowKind
Coarse structural classification for the snap-restore consume gate.
Definition EngineTypes.h:39
Definition IGeometryResolver.h:14
constexpr QLatin1String LayoutRegistry("org.plasmazones.LayoutRegistry")
QList< EmptyZoneEntry > EmptyZoneList
Definition ZoneTypes.h:58
Definition WindowTrackingService.h:37
Definition WindowTrackingService.h:45
Definition IWindowTrackingService.h:22
Definition IWindowTrackingService.h:26
Definition EngineTypes.h:55
Definition EngineTypes.h:46
Definition PlacementConfig.h:11
Pre-computed snap restore target: zone geometry + the saved screen it lives on.
Definition WindowTrackingService.h:675
QString screenId
Definition WindowTrackingService.h:677
QRect geometry
Definition WindowTrackingService.h:676