Phosphor
Qt6 / Wayland library suite for window-management tools
 
Loading...
Searching...
No Matches
IWindowTrackingService.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2026 fuddlesworth
2// SPDX-License-Identifier: LGPL-2.1-or-later
3
4#pragma once
5
8#include <phosphorengine_export.h>
9
10#include <QHash>
11#include <QList>
12#include <QRect>
13#include <QSet>
14#include <QString>
15#include <QStringList>
16#include <QUuid>
17#include <QVector>
18
19#include <optional>
20
21class QObject;
22
23namespace PhosphorZones {
24class Layout;
25}
26
27namespace PhosphorScreens {
28class ScreenManager;
29}
30
31namespace PhosphorEngine {
32
33class PHOSPHORENGINE_EXPORT IWindowTrackingService
34{
35public:
36 virtual ~IWindowTrackingService() = default;
37
38 virtual QObject* asQObject() = 0;
39
40 // ═══════════════════════════════════════════════════════════════════════════
41 // Screen manager access
42 // Tech debt: returns concrete ScreenManager* — should be an IScreenManager
43 // interface once one exists. Acceptable as a stepping stone; the
44 // IScreenManager extraction is tracked separately.
45 // ═══════════════════════════════════════════════════════════════════════════
46
48
49 // ═══════════════════════════════════════════════════════════════════════════
50 // Zone assignment management
51 // ═══════════════════════════════════════════════════════════════════════════
52
53 virtual void assignWindowToZone(const QString& windowId, const QString& zoneId, const QString& screenId,
54 int virtualDesktop) = 0;
55 virtual void assignWindowToZones(const QString& windowId, const QStringList& zoneIds, const QString& screenId,
56 int virtualDesktop) = 0;
57 virtual void unassignWindow(const QString& windowId) = 0;
58
65 virtual QStringList recordedSnapZones(const QString& windowId) const = 0;
66
67 virtual QString zoneForWindow(const QString& windowId) const = 0;
68 virtual QStringList zonesForWindow(const QString& windowId) const = 0;
74 virtual QString screenForWindow(const QString& windowId) const = 0;
76 virtual QString screenForWindow(const QString& windowId, const QString& defaultScreen) const = 0;
77 virtual QStringList windowsInZone(const QString& zoneId) const = 0;
78 virtual bool isWindowSnapped(const QString& windowId) const = 0;
79 virtual QString findEmptyZone(const QString& screenId = QString()) const = 0;
80
81 // ═══════════════════════════════════════════════════════════════════════════
82 // Auto-snap
83 // ═══════════════════════════════════════════════════════════════════════════
84
85 virtual void recordSnapIntent(const QString& windowId, bool wasUserInitiated) = 0;
86
87 // ═══════════════════════════════════════════════════════════════════════════
88 // Floating state
89 // ═══════════════════════════════════════════════════════════════════════════
90
91 virtual bool isWindowFloating(const QString& windowId) const = 0;
97 virtual bool isSuspensionFloat(const QString& windowId) const
98 {
99 Q_UNUSED(windowId)
100 return false;
101 }
108 virtual void clearSuspensionFloat(const QString& windowId)
109 {
110 Q_UNUSED(windowId)
111 }
112 virtual void setWindowFloating(const QString& windowId, bool floating) = 0;
113 virtual void unsnapForFloat(const QString& windowId) = 0;
114 virtual bool clearFloatingForSnap(const QString& windowId) = 0;
115
116 // ═══════════════════════════════════════════════════════════════════════════
117 // Sticky state
118 // ═══════════════════════════════════════════════════════════════════════════
119
120 virtual bool isWindowSticky(const QString& windowId) const = 0;
121
122 // ═══════════════════════════════════════════════════════════════════════════
123 // Pre-float zone/screen restore
124 // ═══════════════════════════════════════════════════════════════════════════
125
126 virtual QStringList preFloatZones(const QString& windowId) const = 0;
127 virtual QString preFloatScreen(const QString& windowId) const = 0;
132 virtual void clearPreFloatZone(const QString& windowId) = 0;
133
134 // ═══════════════════════════════════════════════════════════════════════════
135 // Auto-snap / pending restore
136 // ═══════════════════════════════════════════════════════════════════════════
137
138 virtual bool clearAutoSnapped(const QString& windowId) = 0;
139 virtual bool consumePendingAssignment(const QString& windowId) = 0;
140 virtual const QHash<QString, QList<PendingRestore>>& pendingRestoreQueues() const = 0;
141
142 // ═══════════════════════════════════════════════════════════════════════════
143 // Last-used zone tracking
144 // ═══════════════════════════════════════════════════════════════════════════
145
146 virtual void updateLastUsedZone(const QString& zoneId, const QString& screenId, const QString& windowClass,
147 int virtualDesktop) = 0;
148
149 // ═══════════════════════════════════════════════════════════════════════════
150 // App identity
151 // ═══════════════════════════════════════════════════════════════════════════
152
153 virtual QString currentAppIdFor(const QString& anyWindowId) const = 0;
154
155 // ═══════════════════════════════════════════════════════════════════════════
156 // Geometry resolution
157 // ═══════════════════════════════════════════════════════════════════════════
158
180 virtual std::optional<QRect> validatedUnmanagedGeometry(const QString& windowId, const QString& screenId,
181 bool exactOnly = false) const = 0;
182
189 virtual void recordFreeGeometry(const QString& windowId, const QString& screenId, const QRect& geometry,
190 bool overwrite) = 0;
191
195 virtual void clearFreeGeometry(const QString& windowId) = 0;
196
204 virtual void releaseEngineSlot(const QString& windowId, const QString& engineId)
205 {
206 Q_UNUSED(windowId)
207 Q_UNUSED(engineId)
208 }
213 virtual void clearFreeGeometry(const QString& windowId, const QString& screenId)
214 {
215 Q_UNUSED(screenId)
216 clearFreeGeometry(windowId);
217 }
218 virtual QRect zoneGeometry(const QString& zoneId, const QString& screenId = QString()) const = 0;
219 virtual QRect resolveZoneGeometry(const QStringList& zoneIds, const QString& screenId) const = 0;
220 virtual QString resolveEffectiveScreenId(const QString& screenId) const = 0;
221
225 // Tech debt: takes concrete Layout* — should take an opaque layout identifier
226 // once the layout interface is extracted. Acceptable for this extraction phase.
227 virtual QString findEmptyZoneInLayout(PhosphorZones::Layout* layout, const QString& screenId,
228 int desktopFilter = 0) const = 0;
229 virtual QSet<QUuid> buildOccupiedZoneSet(const QString& screenFilter = QString(), int desktopFilter = 0) const = 0;
230
231 // ═══════════════════════════════════════════════════════════════════════════
232 // Resnap buffer
233 // ═══════════════════════════════════════════════════════════════════════════
234
235 virtual QVector<ResnapEntry> takeResnapBuffer() = 0;
236};
237
238} // namespace PhosphorEngine
Definition IWindowTrackingService.h:34
virtual bool isSuspensionFloat(const QString &windowId) const
Whether the window's float is a MINIMIZE SUSPENSION rather than placement intent.
Definition IWindowTrackingService.h:97
virtual QStringList windowsInZone(const QString &zoneId) const =0
virtual QStringList preFloatZones(const QString &windowId) const =0
virtual QString resolveEffectiveScreenId(const QString &screenId) const =0
virtual bool clearFloatingForSnap(const QString &windowId)=0
virtual void recordFreeGeometry(const QString &windowId, const QString &screenId, const QRect &geometry, bool overwrite)=0
Record a window's SHARED free/float geometry (the single float-back store — the placement record's fr...
virtual void clearSuspensionFloat(const QString &windowId)
Drop the suspension classification.
Definition IWindowTrackingService.h:108
virtual QStringList recordedSnapZones(const QString &windowId) const =0
A window's recorded snap zone(s), preferring the LIVE assignment but falling back to the DURABLE plac...
virtual void updateLastUsedZone(const QString &zoneId, const QString &screenId, const QString &windowClass, int virtualDesktop)=0
virtual QString screenForWindow(const QString &windowId) const =0
The screen a window is assigned to (empty when none), canonicalizing the id so a window resolves acro...
virtual void assignWindowToZones(const QString &windowId, const QStringList &zoneIds, const QString &screenId, int virtualDesktop)=0
virtual void releaseEngineSlot(const QString &windowId, const QString &engineId)
Downgrade engineId's slot on windowId's record to WindowPlacement::stateReleased() and mark the place...
Definition IWindowTrackingService.h:204
virtual QString screenForWindow(const QString &windowId, const QString &defaultScreen) const =0
Same, returning defaultScreen when the window has no assignment.
virtual QSet< QUuid > buildOccupiedZoneSet(const QString &screenFilter=QString(), int desktopFilter=0) const =0
virtual QRect zoneGeometry(const QString &zoneId, const QString &screenId=QString()) const =0
virtual WindowPlacementStore & placementStore()=0
The unified, engine-agnostic placement store.
virtual void setWindowFloating(const QString &windowId, bool floating)=0
virtual QString findEmptyZone(const QString &screenId=QString()) const =0
virtual QString zoneForWindow(const QString &windowId) const =0
virtual QRect resolveZoneGeometry(const QStringList &zoneIds, const QString &screenId) const =0
virtual QString currentAppIdFor(const QString &anyWindowId) const =0
virtual bool isWindowFloating(const QString &windowId) const =0
virtual void assignWindowToZone(const QString &windowId, const QString &zoneId, const QString &screenId, int virtualDesktop)=0
virtual const QHash< QString, QList< PendingRestore > > & pendingRestoreQueues() const =0
virtual QVector< ResnapEntry > takeResnapBuffer()=0
virtual bool isWindowSnapped(const QString &windowId) const =0
virtual bool isWindowSticky(const QString &windowId) const =0
virtual QStringList zonesForWindow(const QString &windowId) const =0
virtual void clearFreeGeometry(const QString &windowId)=0
Clear a window's shared free/float geometry (all screens) from the record, leaving its engine slots i...
virtual void unassignWindow(const QString &windowId)=0
virtual bool consumePendingAssignment(const QString &windowId)=0
virtual void unsnapForFloat(const QString &windowId)=0
virtual void clearFreeGeometry(const QString &windowId, const QString &screenId)
Screen-scoped consume-once variant: clears only screenId's remembered float-back, preserving other mo...
Definition IWindowTrackingService.h:213
virtual bool clearAutoSnapped(const QString &windowId)=0
virtual QString findEmptyZoneInLayout(PhosphorZones::Layout *layout, const QString &screenId, int desktopFilter=0) const =0
virtual PhosphorScreens::ScreenManager * screenManager() const =0
virtual void clearPreFloatZone(const QString &windowId)=0
Clear the saved pre-float zone/screen for windowId (both the windowId key and its appId alias).
virtual void recordSnapIntent(const QString &windowId, bool wasUserInitiated)=0
virtual QString preFloatScreen(const QString &windowId) const =0
virtual std::optional< QRect > validatedUnmanagedGeometry(const QString &windowId, const QString &screenId, bool exactOnly=false) const =0
The window's remembered UNMANAGED (free/float-back) geometry, resolved FOR screenId,...
The single source of truth for window restore state in the unified model.
Definition WindowPlacementStore.h:34
Centralized screen-topology service.
Definition Manager.h:75
Represents a collection of zones that form a layout.
Definition Layout.h:42
Definition EngineTypes.h:14
Definition IWindowTrackingService.h:27
Definition IWindowTrackingService.h:23