Phosphor
Qt6 / Wayland library suite for window-management tools
 
Loading...
Searching...
No Matches
DaemonClient.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
6#include <phosphorcompositor_export.h>
14
15#include <QObject>
16#include <QRect>
17#include <QString>
18#include <QStringList>
19
20class QDBusServiceWatcher;
21
23
24class PHOSPHORCOMPOSITOR_EXPORT DaemonClient : public QObject
25{
26 Q_OBJECT
27
28public:
29 explicit DaemonClient(QObject* parent = nullptr);
30 ~DaemonClient() override;
31
32 bool isDaemonReady() const
33 {
34 // "Ready" means REACHABLE: probeDaemonAvailable sets this without
35 // wiring the signal subscriptions (only a successful registerBridge
36 // does). Callers needing the signal stream must register.
37 return m_daemonReady;
38 }
39
42 {
43 m_dragHandler = handler;
44 }
47 {
48 m_geometryHandler = handler;
49 }
52 {
53 m_lifecycleHandler = handler;
54 }
55
56 // Registration
57 void registerBridge(const QString& compositorId, int apiVersion, const QStringList& capabilities);
58
59 // Window lifecycle notifications (plugin → daemon)
60 void notifyWindowOpened(const QString& windowId, const QString& screenId, int minWidth = 0, int minHeight = 0);
62 void notifyWindowClosed(const QString& windowId);
63 void notifyWindowActivated(const QString& windowId, const QString& screenId);
64
65 // Drag operations (plugin → daemon)
78 void beginDrag(const QString& windowId, const QRect& frameGeometry, const QString& startScreenId,
79 int mouseButtons = 0);
80 void updateDragCursor(const QString& windowId, int cursorX, int cursorY, int modifiers = 0, int mouseButtons = 0);
81 void endDrag(const QString& windowId, int cursorX, int cursorY, int modifiers = 0, int mouseButtons = 0,
82 bool cancelled = false);
83
84 // Screen notifications (plugin → daemon)
85 void notifyCursorScreenChanged(const QString& screenId);
86 void notifyPrimaryScreen(const QString& screenName);
87
88 // Queries (plugin → daemon, async results via signals)
92 void queryVirtualScreens(const QString& screenId);
93 void pruneStaleWindows(const QStringList& liveWindowIds);
94
95 // Daemon availability probe (async — emits daemonReady if responsive).
96 // The default comes from the shared constant rather than a literal so the
97 // two cannot drift.
98 //
99 // NOTE: this entry point currently has NO caller in the repo. The
100 // compositor plugin reaches readiness through registerBridge instead.
101 // Kept as part of the library's public surface, but do not read the
102 // constant's own doc as evidence of a live probe site.
104
105Q_SIGNALS:
108 void bridgeRegistered(const QString& sessionId, int peerApiVersion);
109 void bridgeRejected(const QString& reason);
110
111 void floatingWindowsReceived(const QStringList& windowIds);
112 void snappedWindowsReceived(const QStringList& windowIds);
113 void pendingRestoreGeometriesReceived(const QString& json);
114 void virtualScreensReceived(const QString& screenId, const PhosphorProtocol::WindowGeometryList& geometries);
115
117 void virtualScreensChanged(const QString& screenId);
118
121 void dragPolicyReceived(const QString& windowId, const PhosphorProtocol::DragPolicy& policy);
124 void dragOutcomeReceived(const QString& windowId, const PhosphorProtocol::DragOutcome& outcome);
125
126 void snapAssistReady(const QString& windowId, const QString& screenId,
131
132private Q_SLOTS:
133 void onDaemonReadySignal();
134 void onServiceRegistered();
135 void onServiceUnregistered();
136 void handleApplyGeometry(const QString& windowId, int x, int y, int w, int h, const QString& zoneId,
137 const QString& screenId, bool sizeOnly);
138 void handleApplyGeometriesBatch(const PhosphorProtocol::WindowGeometryList& geometries, const QString& action);
139 void handleRaiseWindows(const QStringList& windowIds);
140 void handleActivateWindow(const QString& windowId);
141 void handleDragPolicyChanged(const QString& windowId, const PhosphorProtocol::DragPolicy& newPolicy);
142 void handleWindowFloatingChanged(const QString& windowId, bool isFloating, const QString& screenId);
143 void handleRestoreSizeDuringDrag(const QString& windowId, int width, int height);
144 void handleMoveWindowToZone(const QString& windowId, const QString& screenId, int x, int y, int w, int h);
145 void handleSnapAllWindows(const QString& screenId);
146 void handleSnapAssistReady(const QString& windowId, const QString& screenId,
148
149private:
150 void connectDaemonSignals();
151 void disconnectDaemonSignals();
152
153 QDBusServiceWatcher* m_serviceWatcher = nullptr;
154 IDragHandler* m_dragHandler = nullptr;
155 IGeometryHandler* m_geometryHandler = nullptr;
156 ILifecycleHandler* m_lifecycleHandler = nullptr;
157
158 bool m_daemonReady = false;
159 bool m_daemonSignalsConnected = false;
160 bool m_registrationInFlight = false;
161 QString m_sessionId;
162};
163
164} // namespace PhosphorCompositor
Definition DaemonClient.h:25
DaemonClient(QObject *parent=nullptr)
void setDragHandler(IDragHandler *handler)
Definition DaemonClient.h:41
void endDrag(const QString &windowId, int cursorX, int cursorY, int modifiers=0, int mouseButtons=0, bool cancelled=false)
void registerBridge(const QString &compositorId, int apiVersion, const QStringList &capabilities)
void pruneStaleWindows(const QStringList &liveWindowIds)
void notifyCursorScreenChanged(const QString &screenId)
void notifyWindowActivated(const QString &windowId, const QString &screenId)
void queryVirtualScreens(const QString &screenId)
void bridgeRegistered(const QString &sessionId, int peerApiVersion)
void snappedWindowsReceived(const QStringList &windowIds)
void floatingWindowsReceived(const QStringList &windowIds)
void beginDrag(const QString &windowId, const QRect &frameGeometry, const QString &startScreenId, int mouseButtons=0)
Canonical drag surface, mirroring org.plasmazones.WindowDrag.
void setGeometryHandler(IGeometryHandler *handler)
Definition DaemonClient.h:46
void virtualScreensChanged(const QString &screenId)
void notifyWindowOpened(const QString &windowId, const QString &screenId, int minWidth=0, int minHeight=0)
void snapAssistReady(const QString &windowId, const QString &screenId, const PhosphorProtocol::EmptyZoneList &zones)
void dragOutcomeReceived(const QString &windowId, const PhosphorProtocol::DragOutcome &outcome)
Daemon's reply to endDrag.
void pendingRestoreGeometriesReceived(const QString &json)
void probeDaemonAvailable(int timeoutMs=PhosphorProtocol::Service::DaemonReadyProbeTimeoutMs)
void notifyPrimaryScreen(const QString &screenName)
void notifyWindowClosed(const QString &windowId)
void bridgeRejected(const QString &reason)
void virtualScreensReceived(const QString &screenId, const PhosphorProtocol::WindowGeometryList &geometries)
void notifyWindowOpenedBatch(const PhosphorProtocol::WindowOpenedList &windows)
bool isDaemonReady() const
Definition DaemonClient.h:32
void dragPolicyReceived(const QString &windowId, const PhosphorProtocol::DragPolicy &policy)
Daemon's reply to beginDrag.
void updateDragCursor(const QString &windowId, int cursorX, int cursorY, int modifiers=0, int mouseButtons=0)
void setLifecycleHandler(ILifecycleHandler *handler)
Definition DaemonClient.h:51
Definition IDragHandler.h:13
Definition IGeometryHandler.h:30
Definition ILifecycleHandler.h:12
Definition DaemonClient.h:22
constexpr int DaemonReadyProbeTimeoutMs
Definition ServiceConstants.h:344
QList< WindowGeometryEntry > WindowGeometryList
Definition WindowTypes.h:51
QList< WindowOpenedEntry > WindowOpenedList
Definition WindowTypes.h:73
QList< EmptyZoneEntry > EmptyZoneList
Definition ZoneTypes.h:58
Drag outcome — daemon-authoritative decision about what to apply at drag end.
Definition DragTypes.h:103
Drag policy — daemon-authoritative decision about how a drag should be handled.
Definition DragTypes.h:76