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
7#include <phosphorengine_export.h>
8
9#include <QHash>
10#include <QJsonObject>
11#include <QObject>
12#include <QPointer>
13#include <QRect>
14#include <QSet>
15#include <QString>
16#include <QVariantMap>
17
18namespace PhosphorEngine {
19
20enum class WindowState {
24};
25
36class PHOSPHORENGINE_EXPORT PlacementEngineBase : public QObject, public IPlacementEngine
37{
38 Q_OBJECT
39
40public:
42 {
43 QRect geometry;
44 QString screenId;
45 };
46
47 WindowState windowState(const QString& windowId) const;
48
49 void claimWindow(const QString& windowId, const QRect& geometry, const QString& screenId, bool overwrite = false);
50 void releaseWindow(const QString& windowId);
51 void floatWindow(const QString& windowId);
52 void unfloatWindow(const QString& windowId);
53
54 QRect unmanagedGeometry(const QString& windowId) const;
55 QString unmanagedScreen(const QString& windowId) const;
56 bool hasUnmanagedGeometry(const QString& windowId) const;
57 void clearUnmanagedGeometry(const QString& windowId);
58 void forgetWindow(const QString& windowId);
59 void storeUnmanagedGeometry(const QString& windowId, const QRect& geometry, const QString& screenId,
60 bool overwrite = false);
61
62 const QHash<QString, UnmanagedEntry>& unmanagedGeometries() const
63 {
64 return m_unmanagedGeometries;
65 }
66 void setUnmanagedGeometries(const QHash<QString, UnmanagedEntry>& geos);
67 virtual int pruneStaleWindows(const QSet<QString>& aliveWindowIds);
68
69 QJsonObject serializeBaseState() const;
70 void deserializeBaseState(const QJsonObject& state);
71
72 // ═══════════════════════════════════════════════════════════════════════════
73 // Settings — universal pattern for all engines
74 //
75 // The daemon calls setEngineSettings() once at startup with a QObject*
76 // that implements the engine's specific settings interface (e.g.
77 // IAutotileSettings, ISnapSettings). Engines qobject_cast at point of
78 // use to their interface type. No caching, no bridge, no signal wiring
79 // inside the engine — the daemon handles change signals externally.
80 // ═══════════════════════════════════════════════════════════════════════════
81
82 void setEngineSettings(QObject* settings);
83 QObject* engineSettings() const
84 {
85 return m_engineSettings;
86 }
87
88 // Public dtor required for unique_ptr<PlacementEngineBase> in Daemon.
90
91protected:
92 explicit PlacementEngineBase(QObject* parent = nullptr);
93
94 virtual void onWindowClaimed(const QString& windowId) = 0;
95 virtual void onWindowReleased(const QString& windowId) = 0;
96 virtual void onWindowFloated(const QString& windowId) = 0;
97 virtual void onWindowUnfloated(const QString& windowId) = 0;
98
99Q_SIGNALS:
100 void geometryRestoreRequested(const QString& windowId, const QRect& geometry, const QString& screenId);
101 void windowStateTransitioned(const QString& windowId, WindowState oldState, WindowState newState);
102
103 void navigationFeedback(bool success, const QString& action, const QString& reason, const QString& sourceId,
104 const QString& targetId, const QString& screenId);
105 void windowFloatingChanged(const QString& windowId, bool floating, const QString& screenId);
106 void activateWindowRequested(const QString& windowId);
107
110 void windowFloatingStateSynced(const QString& windowId, bool floating, const QString& screenId);
111
113 void windowsBatchFloated(const QStringList& windowIds, const QString& screenId);
114
116 void algorithmChanged(const QString& algorithmId);
117
119 void placementChanged(const QString& screenId);
120
122 void windowsReleased(const QStringList& windowIds, const QSet<QString>& releasedScreenIds);
123
127
128private:
129 QHash<QString, UnmanagedEntry> m_unmanagedGeometries;
130 QHash<QString, WindowState> m_windowStates;
131 QPointer<QObject> m_engineSettings;
132};
133
134} // namespace PhosphorEngine
Unified placement engine interface.
Definition IPlacementEngine.h:57
Abstract base class for placement engines.
Definition PlacementEngineBase.h:37
void setEngineSettings(QObject *settings)
void setUnmanagedGeometries(const QHash< QString, UnmanagedEntry > &geos)
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)
virtual void onWindowReleased(const QString &windowId)=0
const QHash< QString, UnmanagedEntry > & unmanagedGeometries() const
Definition PlacementEngineBase.h:62
void deserializeBaseState(const QJsonObject &state)
void forgetWindow(const QString &windowId)
void unfloatWindow(const QString &windowId)
QString unmanagedScreen(const QString &windowId) const
WindowState windowState(const QString &windowId) const
void algorithmChanged(const QString &algorithmId)
Emitted when the active tiling algorithm changes.
void geometryRestoreRequested(const QString &windowId, const QRect &geometry, const QString &screenId)
void windowStateTransitioned(const QString &windowId, WindowState oldState, WindowState newState)
bool hasUnmanagedGeometry(const QString &windowId) const
void activateWindowRequested(const QString &windowId)
void claimWindow(const QString &windowId, const QRect &geometry, const QString &screenId, bool overwrite=false)
void floatWindow(const QString &windowId)
PlacementEngineBase(QObject *parent=nullptr)
void placementChanged(const QString &screenId)
Emitted when the placement layout changes for a screen.
virtual void onWindowClaimed(const QString &windowId)=0
QJsonObject serializeBaseState() const
virtual int pruneStaleWindows(const QSet< QString > &aliveWindowIds)
void storeUnmanagedGeometry(const QString &windowId, const QRect &geometry, const QString &screenId, bool overwrite=false)
void settingsPersistRequested()
Emitted when the engine writes tuning values back to the settings object and wants the daemon to pers...
void releaseWindow(const QString &windowId)
void windowsReleased(const QStringList &windowIds, const QSet< QString > &releasedScreenIds)
Emitted when windows are released from engine management.
void clearUnmanagedGeometry(const QString &windowId)
virtual void onWindowUnfloated(const QString &windowId)=0
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.
virtual void onWindowFloated(const QString &windowId)=0
QObject * engineSettings() const
Definition PlacementEngineBase.h:83
QRect unmanagedGeometry(const QString &windowId) const
Definition EngineTypes.h:13
WindowState
Definition PlacementEngineBase.h:20
Definition PlacementEngineBase.h:42
QString screenId
Definition PlacementEngineBase.h:44
QRect geometry
Definition PlacementEngineBase.h:43