Phosphor
Qt6 / Wayland library suite for window-management tools
 
Loading...
Searching...
No Matches
snapnavigationtargets.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 <phosphorsnapengine_export.h>
9
10#include <QRect>
11#include <QString>
12#include <QStringList>
13
14#include <functional>
15
16namespace PhosphorZones {
17class LayoutRegistry;
18}
19
20namespace PhosphorScreens {
21class ScreenManager;
22}
23
24namespace PhosphorEngine {
25class ICrossSurfaceResolver;
26}
27
28namespace PhosphorSnapEngine {
29
30class ISettings;
31class IZoneAdjacencyResolver;
32
37{
38 bool success = false;
39 QString reason;
45 QStringList zoneIds;
47 QRect geometry;
49 QString sourceZoneId;
50 QString screenName;
52 bool grew = false;
53};
54
61PHOSPHORSNAPENGINE_EXPORT bool isStoredScreenValid(PhosphorScreens::ScreenManager* mgr, const QString& storedScreen);
62
67inline QString oppositeCrossingDirection(const QString& direction)
68{
69 if (direction == QLatin1String("left")) {
70 return QStringLiteral("right");
71 }
72 if (direction == QLatin1String("right")) {
73 return QStringLiteral("left");
74 }
75 if (direction == QLatin1String("up")) {
76 return QStringLiteral("down");
77 }
78 if (direction == QLatin1String("down")) {
79 return QStringLiteral("up");
80 }
81 return {};
82}
83
116class PHOSPHORSNAPENGINE_EXPORT SnapNavigationTargetResolver
117{
118public:
125 std::function<void(bool success, const QString& action, const QString& reason, const QString& sourceZoneId,
126 const QString& targetZoneId, const QString& screenId)>;
127
137 PhosphorZones::LayoutRegistry* layoutManager, IZoneAdjacencyResolver* zoneAdjacency,
138 FeedbackFn feedback);
139
144
150
163 using NeighbourTilingFn = std::function<bool(const QString& screenId)>;
165
166 PhosphorProtocol::MoveTargetResult getMoveTargetForWindow(const QString& windowId, const QString& direction,
167 const QString& screenId);
168
185 SpanTargetResult getSpanTargetForWindow(const QString& windowId, const QString& direction, const QString& screenId);
186
187 PhosphorProtocol::FocusTargetResult getFocusTargetForWindow(const QString& windowId, const QString& direction,
188 const QString& screenId);
189
190 PhosphorProtocol::RestoreTargetResult getRestoreForWindow(const QString& windowId, const QString& screenId);
191
193 const QString& screenId);
194
195 PhosphorProtocol::SwapTargetResult getSwapTargetForWindow(const QString& windowId, const QString& direction,
196 const QString& screenId);
197
198 PhosphorProtocol::MoveTargetResult getPushTargetForWindow(const QString& windowId, const QString& screenId);
199
201 const QString& screenId);
202
203private:
212 bool hasDependencies() const
213 {
214 return m_service != nullptr && m_layoutManager != nullptr;
215 }
216
221 void emitFeedback(bool success, const QString& action, const QString& reason, const QString& sourceZoneId,
222 const QString& targetZoneId, const QString& screenId) const
223 {
224 if (m_feedback) {
225 m_feedback(success, action, reason, sourceZoneId, targetZoneId, screenId);
226 }
227 }
228
236 PhosphorProtocol::MoveTargetResult crossOutputEntryTarget(const QString& currentZoneId, const QString& direction,
237 const QString& sourceScreenId,
238 bool requireSnapNeighbour) const;
239
248 PhosphorProtocol::SwapTargetResult crossOutputSwapTarget(const QString& windowId, const QString& currentZoneId,
249 const QString& direction,
250 const QString& sourceScreenId) const;
251
259 QStringList windowsInZoneOnScreen(const QString& zoneId, const QString& screenName) const;
260
264 QString firstWindowInZoneOnScreen(const QString& zoneId, const QString& screenName) const;
265
266 PhosphorEngine::IWindowTrackingService* m_service = nullptr;
267 PhosphorZones::LayoutRegistry* m_layoutManager = nullptr;
268 IZoneAdjacencyResolver* m_zoneAdjacency = nullptr;
269 PhosphorEngine::ICrossSurfaceResolver* m_crossSurface = nullptr;
270 FeedbackFn m_feedback;
271 NeighbourTilingFn m_neighbourIsTiling;
272};
273
274} // namespace PhosphorSnapEngine
Resolves the neighbouring surface — output or virtual desktop — in a direction, for cross-surface win...
Definition ICrossSurfaceResolver.h:21
Definition IWindowTrackingService.h:34
Centralized screen-topology service.
Definition Manager.h:75
Narrow interface for zone-adjacency queries used by snap navigation.
Definition IZoneAdjacencyResolver.h:28
Pure snap-mode navigation target resolver.
Definition snapnavigationtargets.h:117
SpanTargetResult getSpanTargetForWindow(const QString &windowId, const QString &direction, const QString &screenId)
Compute the new zone span when the user grows/shrinks toward direction.
std::function< bool(const QString &screenId)> NeighbourTilingFn
Reports whether a neighbour OUTPUT is owned by a TILING engine — autotile or scrolling,...
Definition snapnavigationtargets.h:163
PhosphorProtocol::RestoreTargetResult getRestoreForWindow(const QString &windowId, const QString &screenId)
PhosphorProtocol::SwapTargetResult getSwapTargetForWindow(const QString &windowId, const QString &direction, const QString &screenId)
void setZoneAdjacencyResolver(IZoneAdjacencyResolver *resolver)
Late setter for the zone adjacency resolver — it may not be available at construction time,...
PhosphorProtocol::MoveTargetResult getMoveTargetForWindow(const QString &windowId, const QString &direction, const QString &screenId)
void setCrossSurfaceResolver(PhosphorEngine::ICrossSurfaceResolver *resolver)
Late setter for the cross-surface resolver (neighbour output / desktop lookup).
SnapNavigationTargetResolver(PhosphorEngine::IWindowTrackingService *service, PhosphorZones::LayoutRegistry *layoutManager, IZoneAdjacencyResolver *zoneAdjacency, FeedbackFn feedback)
Construct the resolver with its pure dependencies.
std::function< void(bool success, const QString &action, const QString &reason, const QString &sourceZoneId, const QString &targetZoneId, const QString &screenId)> FeedbackFn
Callback shape matching SnapEngine::navigationFeedback (and the WindowTrackingAdaptor signal it is ul...
Definition snapnavigationtargets.h:126
PhosphorProtocol::FocusTargetResult getFocusTargetForWindow(const QString &windowId, const QString &direction, const QString &screenId)
PhosphorProtocol::MoveTargetResult getSnapToZoneByNumberTarget(const QString &windowId, int zoneNumber, const QString &screenId)
PhosphorProtocol::CycleTargetResult getCycleTargetForWindow(const QString &windowId, bool forward, const QString &screenId)
void setNeighbourTilingProvider(NeighbourTilingFn fn)
PhosphorProtocol::MoveTargetResult getPushTargetForWindow(const QString &windowId, const QString &screenId)
Manual zone-layout registry + per-context assignment store.
Definition LayoutRegistry.h:89
Definition EngineTypes.h:14
constexpr QLatin1String LayoutRegistry("org.plasmazones.LayoutRegistry")
Definition IWindowTrackingService.h:27
Definition SnapStateResolver.h:11
QString oppositeCrossingDirection(const QString &direction)
The edge a neighbour surface is entered from when crossing in direction: crossing "right" lands on th...
Definition snapnavigationtargets.h:67
PHOSPHORSNAPENGINE_EXPORT bool isStoredScreenValid(PhosphorScreens::ScreenManager *mgr, const QString &storedScreen)
True when storedScreen still resolves on the live screen set: a physical id must be connected; a virt...
Definition IWindowTrackingService.h:23
D-Bus struct for cycle navigation result: (bssss)
Definition NavigationTypes.h:72
D-Bus struct for focus navigation result: (bsssss)
Definition NavigationTypes.h:61
D-Bus struct for move/push/zone-number navigation result: (bssiiiiss)
Definition NavigationTypes.h:42
D-Bus struct for restore navigation result: (bbiiii)
Definition NavigationTypes.h:110
D-Bus struct for swap navigation result: (bssiiiissiiiisssss)
Definition NavigationTypes.h:82
Result of a span (grow/shrink) target computation.
Definition snapnavigationtargets.h:37
QRect geometry
Union rect of the new span's zone geometries.
Definition snapnavigationtargets.h:47
bool success
Definition snapnavigationtargets.h:38
QString sourceZoneId
Primary zone before the change (empty when the window was unsnapped).
Definition snapnavigationtargets.h:49
QString reason
Definition snapnavigationtargets.h:39
QString screenName
Definition snapnavigationtargets.h:50
bool grew
true when the span grew into new zone(s), false when it retracted.
Definition snapnavigationtargets.h:52
QStringList zoneIds
The window's full NEW span set, primary zone first.
Definition snapnavigationtargets.h:45