Phosphor
Qt6 / Wayland library suite for window-management tools
 
Loading...
Searching...
No Matches
PlacementEngineBase.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 <QObject>
11#include <QPointer>
12#include <QRect>
13#include <QSet>
14#include <QString>
15#include <QStringList>
16
17namespace PhosphorEngine {
18
19struct LayerSwitchResult;
20
31class PHOSPHORENGINE_EXPORT PlacementEngineBase : public QObject, public IPlacementEngine
32{
33 Q_OBJECT
34
35public:
39 virtual int pruneStaleWindows(const QSet<QString>& aliveWindowIds);
40
51 virtual QRect lastManagedRect(const QString& windowId) const
52 {
53 Q_UNUSED(windowId)
54 return {};
55 }
56
57 // ═══════════════════════════════════════════════════════════════════════════
58 // Settings — universal pattern for all engines
59 //
60 // The daemon calls setEngineSettings() once at startup with a QObject*
61 // that implements the engine's specific settings interface (e.g.
62 // IAutotileSettings, ISnapSettings). Engines qobject_cast at point of
63 // use to their interface type. No caching, no bridge, no signal wiring
64 // inside the engine — the daemon handles change signals externally.
65 // A nullptr is REFUSED with a warning (there is deliberately no unset
66 // path); lifetime is handled by the QPointer member, so a destroyed
67 // settings object reads back null without a teardown-symmetry clear.
68 // ═══════════════════════════════════════════════════════════════════════════
69
70 void setEngineSettings(QObject* settings);
71 QObject* engineSettings() const
72 {
73 return m_engineSettings;
74 }
75
76 // Public dtor required for unique_ptr<PlacementEngineBase> in Daemon.
78
79protected:
80 explicit PlacementEngineBase(QObject* parent = nullptr);
81
91 void announceLayerSwitch(const LayerSwitchResult& result, const QString& action, const QString& screenId);
92
93Q_SIGNALS:
94 void geometryRestoreRequested(const QString& windowId, const QRect& geometry, const QString& screenId);
95
96 void navigationFeedback(bool success, const QString& action, const QString& reason, const QString& sourceId,
97 const QString& targetId, const QString& screenId);
98 void windowFloatingChanged(const QString& windowId, bool floating, const QString& screenId);
99 void activateWindowRequested(const QString& windowId);
100
105 void windowDesktopMoveRequested(const QString& windowId, int desktop);
106
118 void windowOutputMoveExpected(const QString& windowId, const QString& targetScreenId);
119
130 void crossModeMoveRequested(const QString& windowId, const QString& targetScreenId, int targetDesktop,
131 const QString& direction);
132
142 void crossModeSwapRequested(const QString& windowId, const QString& targetScreenId, int targetDesktop,
143 const QString& direction);
144
161 void crossModeFocusRequested(const QString& targetScreenId, const QString& direction, bool* handled);
162
165 void windowFloatingStateSynced(const QString& windowId, bool floating, const QString& screenId);
166
168 void windowsBatchFloated(const QStringList& windowIds, const QString& screenId);
169
171 void algorithmChanged(const QString& algorithmId);
172
174 void placementChanged(const QString& screenId);
175
177 void windowsReleased(const QStringList& windowIds, const QSet<QString>& releasedScreenIds);
178
182
183private:
184 QPointer<QObject> m_engineSettings;
185};
186
187} // namespace PhosphorEngine
Unified placement engine interface.
Definition IPlacementEngine.h:72
Abstract base class for placement engines.
Definition PlacementEngineBase.h:32
void windowOutputMoveExpected(const QString &windowId, const QString &targetScreenId)
Emitted when daemon-initiated directional navigation moves a window across physical outputs: the engi...
void setEngineSettings(QObject *settings)
void windowFloatingStateSynced(const QString &windowId, bool floating, const QString &screenId)
Emitted to sync floating state without restoring geometry.
void windowFloatingChanged(const QString &windowId, bool floating, const QString &screenId)
void crossModeSwapRequested(const QString &windowId, const QString &targetScreenId, int targetDesktop, const QString &direction)
Emitted when a directional SWAP reaches a context boundary whose target is a DIFFERENT tiling mode th...
void crossModeFocusRequested(const QString &targetScreenId, const QString &direction, bool *handled)
Emitted when a directional FOCUS reaches a monitor boundary whose neighbour context runs a DIFFERENT ...
void algorithmChanged(const QString &algorithmId)
Emitted when the active tiling algorithm changes.
void geometryRestoreRequested(const QString &windowId, const QRect &geometry, const QString &screenId)
void windowDesktopMoveRequested(const QString &windowId, int desktop)
Emitted when directional navigation moves a window across virtual desktops: the engine has already re...
void activateWindowRequested(const QString &windowId)
void announceLayerSwitch(const LayerSwitchResult &result, const QString &action, const QString &screenId)
Emit the activation + navigationFeedback pair for a resolved layer focus switch (resolveLayerFocusSwi...
virtual QRect lastManagedRect(const QString &windowId) const
The exact rect this engine last APPLIED to windowId while managing it (its tile rect),...
Definition PlacementEngineBase.h:51
PlacementEngineBase(QObject *parent=nullptr)
void placementChanged(const QString &screenId)
Emitted when the placement layout changes for a screen.
virtual int pruneStaleWindows(const QSet< QString > &aliveWindowIds)
Drop any per-engine bookkeeping for windows not in aliveWindowIds.
void settingsPersistRequested()
Emitted when the engine writes tuning values back to the settings object and wants the daemon to pers...
void windowsReleased(const QStringList &windowIds, const QSet< QString > &releasedScreenIds)
Emitted when windows are released from engine management.
void crossModeMoveRequested(const QString &windowId, const QString &targetScreenId, int targetDesktop, const QString &direction)
Emitted when a directional MOVE reaches a context boundary whose target is a DIFFERENT tiling mode th...
void navigationFeedback(bool success, const QString &action, const QString &reason, const QString &sourceId, const QString &targetId, const QString &screenId)
void windowsBatchFloated(const QStringList &windowIds, const QString &screenId)
Emitted when overflow windows are batch-floated during applyTiling.
QObject * engineSettings() const
Definition PlacementEngineBase.h:71
Definition EngineTypes.h:14
Outcome of resolving a layer focus switch.
Definition LayerFocusSwitch.h:53