6#include <phosphorplacement_export.h>
89 QObject* parent =
nullptr);
118 m_windowRegistry = registry;
130 return m_placementStore;
134 return m_placementStore;
177 m_shouldTrackPredicate = std::move(predicate);
193 m_snapEngine = engine;
198 return m_snapEngine.data();
212 m_autotileModePredicate = std::move(predicate);
226 return m_autotileModePredicate && m_autotileModePredicate(windowId);
246 m_autotileTiledPredicate = std::move(predicate);
253 return m_autotileTiledPredicate && m_autotileTiledPredicate(windowId);
261 return m_windowRegistry;
266 return m_screenManager;
281 int virtualDesktop)
override;
291 int virtualDesktop)
override;
323 QString
screenForWindow(
const QString& windowId,
const QString& defaultScreen)
const override;
366 const QString& currentScreenName)
const;
380 bool exactOnly =
false)
const override;
385 bool overwrite)
override;
427 m_engineFloatResolver = std::move(resolver);
431 m_engineFloatWriter = std::move(writer);
437 m_engineFloatLister = std::move(lister);
581 int virtualDesktop)
override;
663 QRect
zoneGeometry(
const QString& zoneId,
const QString& screenId = QString())
const override;
693 const QSet<QString>& includeScreens = {},
int desktopFilter = 0);
703 m_resnapBuffer.clear();
874 return m_pendingRestoreQueues;
879 return std::exchange(m_resnapBuffer, {});
895 const QHash<QString, int>& desktops);
902 m_pendingRestoreQueues = queues;
913 void setLastUsedZone(
const QString& zoneId,
const QString& screenId,
const QString& zoneClass,
int desktop);
920 m_floatingWindows = windows;
968 DirtyActiveLayoutId = 1u << 0,
969 DirtyZoneAssignments = 1u << 1,
970 DirtyPendingRestores = 1u << 2,
971 DirtyPreTileGeometries = 1u << 3,
972 DirtyLastUsedZone = 1u << 4,
973 DirtyPreFloatZones = 1u << 5,
974 DirtyPreFloatScreens = 1u << 6,
975 DirtyUserSnapped = 1u << 7,
976 DirtyAutotileOrders = 1u << 8,
977 DirtyAutotilePending = 1u << 9,
979 DirtyWindowPlacements = 1u << 11,
1022 static constexpr int MinVisibleWidth = 100;
1023 static constexpr int MinVisibleHeight = 100;
1034 void scheduleSaveState(
DirtyMask fields = DirtyAll);
1035 bool isGeometryOnScreen(
const QRect& geometry)
const;
1036 QRect adjustGeometryToScreen(
const QRect& geometry)
const;
1040 template<
typename Func>
1041 auto preFloatLookup(
const QString& windowId, Func&& getter)
const ->
decltype(getter(windowId));
1044 void validateLastUsedZone(
const QString& targetScreen);
1048 static QString findNearestVirtualScreen(
const QStringList& vsIds,
int oldIndex);
1052 struct ZoneLookupResult
1057 ZoneLookupResult findZoneInAllLayouts(
const QUuid& zoneUuid)
const;
1069 int desktopFilter = 0)
const override;
1117 QPointer<PhosphorEngine::PlacementEngineBase> m_snapEngine;
1119 AutotileTiledPredicate m_autotileTiledPredicate{};
1128 QSet<QString> m_floatingWindows;
1131 EngineFloatResolver m_engineFloatResolver{};
1132 EngineFloatWriter m_engineFloatWriter{};
1133 EngineFloatLister m_engineFloatLister{};
1136 QHash<QString, QList<PendingRestore>> m_pendingRestoreQueues;
1141 ShouldTrackPredicate m_shouldTrackPredicate{};
1148 QHash<QString, bool> m_windowStickyStates;
1150 QVector<ResnapEntry> m_resnapBuffer;
1155 DirtyMask m_dirtyMask = DirtyAll;
Definition IWindowTrackingService.h:34
Abstract base class for placement engines.
Definition PlacementEngineBase.h:30
The single source of truth for window restore state in the unified model.
Definition WindowPlacementStore.h:34
Definition WindowRegistry.h:82
Definition IGeometryResolver.h:17
Window-zone tracking service (business logic layer)
Definition WindowTrackingService.h:80
void recordFreeGeometry(const QString &windowId, const QString &screenId, const QRect &geometry, bool overwrite) override
Write the window's shared free/float geometry into the unified record (the single float-back store).
const QHash< QString, QList< PendingRestore > > & pendingRestoreQueues() const override
Get pending restore queues (consumption queue: appId -> list of pending restores)
Definition WindowTrackingService.h:872
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.
bool isWindowInAutotileMode(const QString &windowId) const
True if the window's CURRENT screen mode is autotile.
Definition WindowTrackingService.h:224
void markDirty(DirtyMask fields)
OR the given fields into the dirty mask AND emit stateChanged.
PhosphorProtocol::EmptyZoneList getEmptyZones(const QString &screenId) const
Get typed list of all empty zones for Snap Assist continuation.
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:701
QString screenForWindow(const QString &windowId, const QString &defaultScreen) const override
Same, but returns defaultScreen when the window has no screen assignment — the canonicalizing replace...
void recordSnapIntent(const QString &windowId, bool wasUserInitiated) override
Record that a window class was user-snapped.
QVector< ResnapEntry > takeResnapBuffer() override
Definition WindowTrackingService.h:877
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:918
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:982
DirtyMask peekDirty() const
Return the current dirty mask without clearing.
Definition WindowTrackingService.h:999
const PhosphorEngine::WindowPlacementStore & placementStore() const
Definition WindowTrackingService.h:132
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.
Definition WindowTrackingService.h:191
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:900
void unassignWindow(const QString &windowId) override
Remove window from its assigned zone.
bool isWindowAutotileTiled(const QString &windowId) const
True if the autotile engine reports the window actively tiled.
Definition WindowTrackingService.h:251
QObject * asQObject() override
Definition WindowTrackingService.h:101
void setPreFloatZoneAssignments(const QHash< QString, QStringList > &assignments)
Set pre-float zone assignments (loaded from KConfig by adaptor)
void migrateScreenAssignmentsToVirtual(const QString &physicalScreenId, const QStringList &virtualScreenIds, PhosphorScreens::ScreenManager *mgr)
Migrate window screen assignments from physical to virtual screen IDs.
PhosphorScreens::ScreenManager * screenManager() const override
Definition WindowTrackingService.h:264
QString preFloatZone(const QString &windowId) const
Get primary zone to restore to when unfloating.
void setEngineFloatResolver(EngineFloatResolver resolver)
Definition WindowTrackingService.h:425
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.
QString lastUsedScreenName() const
Screen name companion of the last-used-zone tracking.
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::function< void(const QString &windowId, bool floating)> EngineFloatWriter
Definition WindowTrackingService.h:422
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.
WindowTrackingService(PhosphorZones::LayoutRegistry *layoutManager, PhosphorZones::IZoneDetector *zoneDetector, PhosphorScreens::ScreenManager *screenManager, PhosphorWorkspaces::VirtualDesktopManager *vdm, IGeometryResolver *geometryResolver=nullptr, PlacementConfig config={}, QObject *parent=nullptr)
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)
void recordFloatingClose(const QString &windowId, const QString &screenId, const QRect &geometry)
Authoritative float-back capture for a window closing on screenId.
QStringList recordedSnapZones(const QString &windowId) const override
Live snap zones if present, else the durable placement-record snap slot.
QStringList preFloatZones(const QString &windowId) const override
Get all zones to restore to when unfloating (multi-zone support)
void setEngineFloatLister(EngineFloatLister lister)
Aggregates both engines' floating windows for the engine-agnostic floatingWindows() enumeration.
Definition WindowTrackingService.h:435
DirtyField
Definition WindowTrackingService.h:966
void clearDirty()
Clear every dirty bit.
void windowZoneChanged(const QString &windowId, const QString &zoneId)
void setAutotileTiledPredicate(AutotileTiledPredicate predicate)
Definition WindowTrackingService.h:244
QRect resolveZoneGeometry(const QStringList &zoneIds, const QString &screenId) const override
Resolve zone geometry: combined geometry for multi-zone, single for single zone.
PhosphorEngine::WindowPlacementStore & placementStore() override
The unified, engine-agnostic placement store (one WindowPlacement record per window).
Definition WindowTrackingService.h:128
void migrateScreenAssignmentsFromVirtual(const QString &physicalScreenId)
Reverse migration: virtual screen IDs → physical screen ID.
int lastUsedDesktop() const
Virtual-desktop companion of the last-used-zone tracking.
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:259
std::optional< QRect > validatedUnmanagedGeometry(const QString &windowId, const QString &screenId, bool exactOnly=false) const override
Look up a window's free (unmanaged) geometry from the unified WindowPlacementStore,...
void setLastUsedZone(const QString &zoneId, const QString &screenId, const QString &zoneClass, int desktop)
Set last used zone info (loaded from KConfig by adaptor)
void setAutotileModePredicate(AutotileModePredicate predicate)
Definition WindowTrackingService.h:210
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:175
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.
QString screenForWindow(const QString &windowId) const override
The screen a window is assigned to, or empty when it has none.
std::function< QStringList()> EngineFloatLister
Definition WindowTrackingService.h:423
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 clearFreeGeometry(const QString &windowId) override
Clear a window's shared free/float geometry from the record.
void setWindowRegistry(PhosphorEngine::WindowRegistry *registry)
Wire up the shared WindowRegistry.
Definition WindowTrackingService.h:116
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.
std::function< bool(const QString &windowId)> AutotileModePredicate
Predicate: is the window currently in Autotile mode?
Definition WindowTrackingService.h:209
~WindowTrackingService() override
std::function< bool(const QString &windowId)> EngineFloatResolver
Per-engine float resolver/writer.
Definition WindowTrackingService.h:421
void setSnapState(PhosphorSnapEngine::SnapState *state)
Definition WindowTrackingService.h:121
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
The placement config installed at construction.
Definition WindowTrackingService.h:96
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:196
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 &windowId)> AutotileTiledPredicate
Predicate: is the window ACTIVELY TILED by the autotile engine right now (engine-owned,...
Definition WindowTrackingService.h:243
void setEngineFloatWriter(EngineFloatWriter writer)
Definition WindowTrackingService.h:429
std::function< bool(const QString &screenId, int virtualDesktop)> ShouldTrackPredicate
Predicate type for "is this snap-mode context active?".
Definition WindowTrackingService.h:155
Centralized screen-topology service.
Definition Manager.h:75
Per-screen snap placement state.
Definition SnapState.h:33
Definition VirtualDesktopManager.h:19
Abstract interface for zone detection + highlight lifecycle.
Definition IZoneDetector.h:84
Manual zone-layout registry + per-context assignment store.
Definition LayoutRegistry.h:78
Represents a collection of zones that form a layout.
Definition Layout.h:40
Represents a single zone within a layout.
Definition Zone.h:44
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 IWindowTrackingService.h:27
Definition WindowTrackingService.h:38
Definition WindowTrackingService.h:46
Definition IWindowTrackingService.h:23
Definition EngineTypes.h:73
Definition EngineTypes.h:65
Definition PlacementConfig.h:11
Pre-computed snap restore target: zone geometry + the saved screen it lives on.
Definition WindowTrackingService.h:801
QString screenId
Definition WindowTrackingService.h:803
QRect geometry
Definition WindowTrackingService.h:802