Phosphor
Qt6 / Wayland library suite for window-management tools
 
Loading...
Searching...
No Matches
LayoutRegistry.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
10
11#include <PhosphorWindowRules/RuleEvaluator.h>
12#include <PhosphorWindowRules/WindowRuleStore.h>
13
14#include <QHash>
15#include <QPair>
16#include <QString>
17#include <QUuid>
18#include <functional>
19#include <memory>
20#include <optional>
21
22namespace PhosphorZones {
23
36{
37 QString screenId;
39 QString activity;
40
41 bool operator==(const CombinedAssignmentKey& other) const
42 {
43 return screenId == other.screenId && virtualDesktop == other.virtualDesktop && activity == other.activity;
44 }
45};
46
47inline size_t qHash(const CombinedAssignmentKey& key, size_t seed = 0) noexcept
48{
49 return qHashMulti(seed, key.screenId, key.virtualDesktop, key.activity);
50}
51
77class PHOSPHORZONES_EXPORT LayoutRegistry : public IZoneLayoutRegistry
78{
79 Q_OBJECT
80
81 Q_PROPERTY(int layoutCount READ layoutCount NOTIFY layoutsChanged)
82 // `activeLayout` Q_PROPERTY moved to IZoneLayoutRegistry alongside its
83 // NOTIFY signal so the contract is visible to interface consumers.
84 Q_PROPERTY(QString layoutDirectory READ layoutDirectory WRITE setLayoutDirectory NOTIFY layoutDirectoryChanged)
85
86public:
126 LayoutRegistry(PhosphorWindowRules::WindowRuleStore* ruleStore, QString layoutSubdirectory,
127 QObject* parent = nullptr);
128 ~LayoutRegistry() override;
129
130 // ─── IZoneLayoutRegistry ──────────────────────────────────────────────
131
132 int layoutCount() const override
133 {
134 return m_layouts.size();
135 }
136 QVector<Layout*> layouts() const override
137 {
138 return m_layouts;
139 }
140 Layout* layout(int index) const override;
141 Layout* layoutById(const QUuid& id) const override;
142 Layout* layoutByName(const QString& name) const override;
143
144 Q_INVOKABLE void addLayout(Layout* layout) override;
145 Q_INVOKABLE void removeLayout(Layout* layout) override;
146 Q_INVOKABLE void removeLayoutById(const QUuid& id) override;
147 Q_INVOKABLE Layout* duplicateLayout(Layout* source) override;
148
149 Layout* activeLayout() const override
150 {
151 return m_activeLayout;
152 }
153 Q_INVOKABLE void setActiveLayout(Layout* layout) override;
154 Q_INVOKABLE void setActiveLayoutById(const QUuid& id) override;
155
156 // ─── Layout persistence (disk JSON) ───────────────────────────────────
157
158 QString layoutDirectory() const
159 {
160 return m_layoutDirectory;
161 }
162 void setLayoutDirectory(const QString& directory);
163
164 Q_INVOKABLE void loadLayouts();
165 Q_INVOKABLE void saveLayouts();
166 void saveLayout(Layout* layout);
167
168 Q_INVOKABLE void importLayout(const QString& filePath);
169 Q_INVOKABLE void exportLayout(Layout* layout, const QString& filePath);
170
171 // ─── Assignment persistence (via config backend) ──────────────────────
172
173 Q_INVOKABLE void loadAssignments();
174 Q_INVOKABLE void saveAssignments();
175
176 // ─── Default-layout resolution ────────────────────────────────────────
177
191 Q_INVOKABLE Layout* defaultLayout() const override;
192
202 void setDefaultLayoutIdProvider(std::function<QString()> provider);
203
237 void setDefaultAutotileAlgorithmProvider(std::function<QString()> provider);
238
265 void setSnappingPreferredProvider(std::function<bool()> provider);
266
287 void setDefaultAssignmentSuppressedProvider(std::function<bool()> provider);
288
295 bool snappingPreferred() const;
296
297 // ─── Assignments (per-context routing) ────────────────────────────────
298
303 {
304 return m_previousLayout;
305 }
306
307 Q_INVOKABLE void assignLayout(const QString& screenId, int virtualDesktop, const QString& activity, Layout* layout);
308 Q_INVOKABLE void assignLayoutById(const QString& screenId, int virtualDesktop, const QString& activity,
309 const QString& layoutId);
310
314 void setAssignmentEntryDirect(const QString& screenId, int virtualDesktop, const QString& activity,
315 const AssignmentEntry& entry);
316
317 Q_INVOKABLE Layout* layoutForScreen(const QString& screenId, int virtualDesktop = 0,
318 const QString& activity = QString()) const override;
319
324 Q_INVOKABLE Layout* resolveLayoutForScreen(const QString& screenId) const override
325 {
326 // Resolve against THIS screen's current virtual desktop (Plasma 6.7
327 // per-output virtual desktops, #648). Falls back to the global desktop
328 // when the screen has no per-output value, so every caller (all of which
329 // already pass a screenId) gets per-screen resolution with no edits.
330 return layoutForScreen(screenId, currentVirtualDesktopForScreen(screenId), m_currentActivity);
331 }
332
342 ContextGapOverride resolveContextGaps(const QString& screenId, int virtualDesktop,
343 const QString& activity) const override;
344
351 bool resolveContextLocked(const QString& screenId, int virtualDesktop, const QString& activity) const override;
352
362 std::optional<bool> resolveContextDefaultAssignment(const QString& screenId, int virtualDesktop,
363 const QString& activity) const;
364
372 ContextOverlayOverride resolveContextOverlay(const QString& screenId, int virtualDesktop,
373 const QString& activity) const override;
374
375 Q_INVOKABLE void clearAssignment(const QString& screenId, int virtualDesktop = 0,
376 const QString& activity = QString());
385 Q_INVOKABLE bool hasExplicitAssignment(const QString& screenId, int virtualDesktop = 0,
386 const QString& activity = QString()) const;
387
398 Q_INVOKABLE QString assignmentIdForScreen(const QString& screenId, int virtualDesktop = 0,
399 const QString& activity = QString()) const override;
400
418 AssignmentEntry assignmentEntryForScreen(const QString& screenId, int virtualDesktop = 0,
419 const QString& activity = QString()) const;
420
421 AssignmentEntry::Mode modeForScreen(const QString& screenId, int virtualDesktop = 0,
422 const QString& activity = QString()) const;
423
436 bool isContextActiveLayoutSuppressed(const QString& screenId, int virtualDesktop = 0,
437 const QString& activity = QString()) const override;
438
450 bool isDefaultAssignmentSuppressedForContext(const QString& screenId, int virtualDesktop = 0,
451 const QString& activity = QString()) const;
452
463 QString snappingLayoutForScreen(const QString& screenId, int virtualDesktop = 0,
464 const QString& activity = QString()) const;
465 QString tilingAlgorithmForScreen(const QString& screenId, int virtualDesktop = 0,
466 const QString& activity = QString()) const override;
467
472
474 void setAllScreenAssignments(const QHash<QString, QString>& assignments);
475 void setAllDesktopAssignments(const QHash<QPair<QString, int>, QString>& assignments);
476 void setAllActivityAssignments(const QHash<QPair<QString, QString>, QString>& assignments);
484 void setAllCombinedAssignments(const QHash<CombinedAssignmentKey, QString>& assignments);
485
486 QHash<QPair<QString, int>, QString> desktopAssignments() const;
487 QHash<QPair<QString, QString>, QString> activityAssignments() const;
491 QHash<CombinedAssignmentKey, QString> combinedAssignments() const;
492
493 // ─── Quick-layout slots (1..9) ────────────────────────────────────────
494 //
495 // Quick slots are keyed by tiling mode: Snapping slots hold manual-layout
496 // UUIDs, Autotile slots hold autotile algorithm IDs. The two sets are
497 // independent so the same Meta+Alt+N can map to a zone layout in snapping
498 // mode and an autotile algorithm in autotile mode.
499
504 static constexpr QLatin1String QuickSlotsSnappingKey{"snapping"};
505 static constexpr QLatin1String QuickSlotsAutotileKey{"autotile"};
506
507 Q_INVOKABLE Layout* layoutForShortcut(AssignmentEntry::Mode mode, int number) const;
508 Q_INVOKABLE void applyQuickLayout(AssignmentEntry::Mode mode, int number, const QString& screenId);
509 void setQuickLayoutSlot(AssignmentEntry::Mode mode, int number, const QString& layoutId);
510 void setAllQuickLayoutSlots(AssignmentEntry::Mode mode, const QHash<int, QString>& slots);
511 QHash<int, QString> quickLayoutSlots(AssignmentEntry::Mode mode) const
512 {
513 return m_quickLayoutSlots[modeIndex(mode)];
514 }
515
516 // ─── Layout cycling ───────────────────────────────────────────────────
517
518 Q_INVOKABLE void cycleToPreviousLayout(const QString& screenId);
519 Q_INVOKABLE void cycleToNextLayout(const QString& screenId);
520
521 // ─── Built-in layouts ─────────────────────────────────────────────────
522
523 Q_INVOKABLE void createBuiltInLayouts();
524 QVector<Layout*> builtInLayouts() const;
525
526 // ─── Context (desktop / activity) ─────────────────────────────────────
527
528 Q_INVOKABLE int currentVirtualDesktop() const override
529 {
530 return m_currentVirtualDesktop;
531 }
532 Q_INVOKABLE QString currentActivity() const override
533 {
534 return m_currentActivity;
535 }
536 void setCurrentVirtualDesktop(int desktop)
537 {
538 m_currentVirtualDesktop = desktop;
539 }
542 int currentVirtualDesktopForScreen(const QString& screenId) const override
543 {
544 const auto it = m_screenVirtualDesktop.constFind(screenId);
545 return it != m_screenVirtualDesktop.constEnd() ? it.value() : m_currentVirtualDesktop;
546 }
549 void setCurrentVirtualDesktopForScreen(const QString& screenId, int desktop)
550 {
551 if (!screenId.isEmpty() && desktop >= 1) {
552 m_screenVirtualDesktop.insert(screenId, desktop);
553 }
554 }
556 void clearCurrentVirtualDesktopForScreen(const QString& screenId)
557 {
558 m_screenVirtualDesktop.remove(screenId);
559 }
560 void setCurrentActivity(const QString& activity)
561 {
562 m_currentActivity = activity;
563 }
564
565 // ─── Autotile layout overrides (per-algorithm user overrides) ─────────
566
567 void saveAutotileOverrides(const QString& algorithmId, const QJsonObject& overrides);
568 QJsonObject loadAutotileOverrides(const QString& algorithmId) const override;
569
576 void seedDefaultLayoutSettingsIfFresh(const QJsonObject& defaults);
577
585 [[nodiscard]] int contextResolveCacheSize() const
586 {
587 return static_cast<int>(m_contextResolveCache.size());
588 }
589
590Q_SIGNALS:
591 // layoutAdded / layoutRemoved / activeLayoutChanged / layoutAssigned are
592 // inherited from IZoneLayoutRegistry - declared on the interface so
593 // consumers that target the contract can connect without depending on
594 // the concrete class. Emit sites still live in this TU and reach the
595 // inherited signal via Q_OBJECT's metaobject chain.
600
601private:
604 void initCommon();
605
606 void ensureLayoutDirectory();
607 void loadLayoutsFromDirectory(const QString& directory);
608 Layout* restoreSystemLayout(const QUuid& id, const QString& systemPath);
609 QString layoutFilePath(const QUuid& id) const;
610 QString quickLayoutsFilePath() const;
611 QString layoutSettingsFilePath() const;
612 void readQuickLayouts();
613 void writeQuickLayouts();
617 static constexpr int modeIndex(AssignmentEntry::Mode mode)
618 {
619 return mode == AssignmentEntry::Autotile ? 1 : 0;
620 }
621 Layout* cycleLayoutImpl(const QString& screenId, int direction);
622 bool shouldSkipLayoutAssignment(const QString& layoutId, const QString& context) const;
623 void emitLayoutAssigned(const QString& screenId, int virtualDesktop, const QString& layoutId);
638 void applyLayoutToScreen(const QString& screenId, Layout* layout);
641 void migrateLegacyAutotileOverrides();
642 Layout* resolveConfiguredDefault() const;
643
644 // ─── Rule-backed assignment resolution ────────────────────────────────
645 // The unified WindowRuleStore is the single source of truth for every
646 // per-context assignment. These helpers translate the legacy
647 // AssignmentEntry API onto the rule store + evaluator.
648
677 std::optional<AssignmentEntry> resolveAssignmentEntry(const QString& screenId, int virtualDesktop,
678 const QString& activity) const;
679
684 bool hasExactContextRule(const QString& screenId, int virtualDesktop, const QString& activity) const;
685
697 const PhosphorWindowRules::WindowRule* findExactContextRule(const QString& screenId, int virtualDesktop,
698 const QString& activity) const;
699
702 QUuid exactContextRuleId(const QString& screenId, int virtualDesktop, const QString& activity) const;
703
706 void upsertAssignmentRule(const QString& screenId, int virtualDesktop, const QString& activity,
707 const AssignmentEntry& entry);
708
711 bool removeAssignmentRule(const QString& screenId, int virtualDesktop, const QString& activity);
712
723 template<typename KeyT, typename DecodeFn, typename ValidFn, typename FamilyFn>
724 void applyBatchAssignments(const QHash<KeyT, QString>& assignments, DecodeFn decode, ValidFn valid,
725 FamilyFn familyMatches, int emitDesktop, const QString& emitActivity, const char* label);
726
734 bool purgeSnappingLayoutFromAssignments(const QString& layoutId);
735
748 AssignmentEntry resolveDefaultAssignmentEntryRaw() const;
749
756 AssignmentEntry resolveDefaultAssignmentEntry() const;
757
766 AssignmentEntry resolveDefaultAssignmentEntryForContext(const QString& screenId, int virtualDesktop,
767 const QString& activity) const;
768
776 bool hasMatchingAssignmentRule(const QString& screenId, int virtualDesktop, const QString& activity) const;
777
783 struct ContextResolveKey
784 {
785 QString screenId;
786 int virtualDesktop = 0;
787 QString activity;
788 bool operator==(const ContextResolveKey& other) const noexcept
789 {
790 return virtualDesktop == other.virtualDesktop && screenId == other.screenId && activity == other.activity;
791 }
792 };
793 friend size_t qHash(const LayoutRegistry::ContextResolveKey& key, size_t seed) noexcept
794 {
795 // ::qHash routes to the global Qt qHash overloads — without the leading
796 // qualifier ADL would pick up @c qHash(LayoutAssignmentKey&) (declared
797 // in @c AssignmentEntry.h alongside this header) and fail to convert
798 // each field. Mirrors the same pattern @c LayoutAssignmentKey itself uses.
799 size_t h = seed;
800 h = ::qHash(key.screenId, h);
801 h = ::qHash(key.virtualDesktop, h);
802 h = ::qHash(key.activity, h);
803 return h;
804 }
805
817 template<typename V, typename ComputeFn>
818 V resolveCachedContext(QHash<ContextResolveKey, V>& cache, quint64& cacheRevision, const QString& screenId,
819 int virtualDesktop, const QString& activity, ComputeFn&& compute) const
820 {
821 const quint64 revision = m_ruleStore->ruleSet().revision();
822 if (revision != cacheRevision) {
823 cache.clear();
824 cacheRevision = revision;
825 }
826 const ContextResolveKey key{screenId, virtualDesktop, activity};
827 const auto cached = cache.constFind(key);
828 if (cached != cache.constEnd()) {
829 return cached.value();
830 }
831 V value = compute();
832 constexpr qsizetype kMaxEntries = 256;
833 if (cache.size() >= kMaxEntries) {
834 cache.clear();
835 }
836 cache.insert(key, value);
837 return value;
838 }
839
852 struct RuleSlotResolution
853 {
854 std::optional<AssignmentEntry> modeEntry;
855 std::optional<QString> snappingLayout;
856 std::optional<QString> tilingAlgorithm;
857 };
858
865 mutable QHash<ContextResolveKey, std::optional<RuleSlotResolution>> m_contextResolveCache;
869 mutable quint64 m_contextResolveCacheRevision = 0;
870
877 mutable QHash<ContextResolveKey, ContextGapOverride> m_contextGapCache;
878 mutable quint64 m_contextGapCacheRevision = 0;
879
885 mutable QHash<ContextResolveKey, bool> m_contextLockCache;
886 mutable quint64 m_contextLockCacheRevision = 0;
887
894 mutable QHash<ContextResolveKey, std::optional<bool>> m_contextDefaultAssignmentCache;
895 mutable quint64 m_contextDefaultAssignmentCacheRevision = 0;
896
902 mutable QHash<ContextResolveKey, ContextOverlayOverride> m_contextOverlayCache;
903 mutable quint64 m_contextOverlayCacheRevision = 0;
904
905 std::function<QString()> m_defaultLayoutIdProvider;
911 std::function<QString()> m_defaultAutotileAlgorithmProvider;
916 std::function<bool()> m_snappingPreferredProvider;
921 std::function<bool()> m_defaultAssignmentSuppressedProvider;
925 PhosphorWindowRules::WindowRuleStore* m_ruleStore = nullptr;
927 std::unique_ptr<PhosphorWindowRules::RuleEvaluator> m_evaluator;
928 QString m_layoutSubdirectory;
929 QString m_layoutDirectory;
930 QVector<Layout*> m_layouts;
931 Layout* m_activeLayout = nullptr;
932 Layout* m_previousLayout = nullptr;
936 QHash<int, QString> m_quickLayoutSlots[2];
940 LayoutSettingsStore m_layoutSettings;
941 int m_currentVirtualDesktop = 1;
945 QHash<QString, int> m_screenVirtualDesktop;
946 QString m_currentActivity;
947};
948
949} // namespace PhosphorZones
Enumeration + mutation surface for the in-memory zone-layout catalog.
Definition IZoneLayoutRegistry.h:45
Manual zone-layout registry + per-context assignment store.
Definition LayoutRegistry.h:78
friend size_t qHash(const LayoutRegistry::ContextResolveKey &key, size_t seed) noexcept
Definition LayoutRegistry.h:793
AssignmentEntry::Mode modeForScreen(const QString &screenId, int virtualDesktop=0, const QString &activity=QString()) const
QString layoutDirectory() const
Definition LayoutRegistry.h:158
void applyQuickLayout(AssignmentEntry::Mode mode, int number, const QString &screenId)
void setAllDesktopAssignments(const QHash< QPair< QString, int >, QString > &assignments)
QString assignmentIdForScreen(const QString &screenId, int virtualDesktop=0, const QString &activity=QString()) const override
Raw assignment id for a (screen, desktop, activity) context.
QString snappingLayoutForScreen(const QString &screenId, int virtualDesktop=0, const QString &activity=QString()) const
Per-field cascade readers — return the named field from the first entry in the cascade where it is no...
LayoutRegistry(PhosphorWindowRules::WindowRuleStore *ruleStore, QString layoutSubdirectory, QObject *parent=nullptr)
int currentVirtualDesktop() const override
Definition LayoutRegistry.h:528
QHash< int, QString > quickLayoutSlots(AssignmentEntry::Mode mode) const
Definition LayoutRegistry.h:511
void exportLayout(Layout *layout, const QString &filePath)
Layout * duplicateLayout(Layout *source) override
int layoutCount() const override
Definition LayoutRegistry.h:132
void setActiveLayoutById(const QUuid &id) override
Layout * layoutForScreen(const QString &screenId, int virtualDesktop=0, const QString &activity=QString()) const override
Cascade-resolve the manual layout for screenId.
void setAssignmentEntryDirect(const QString &screenId, int virtualDesktop, const QString &activity, const AssignmentEntry &entry)
Store a full entry directly (from KCM via D-Bus).
void cycleToNextLayout(const QString &screenId)
void setAllActivityAssignments(const QHash< QPair< QString, QString >, QString > &assignments)
void setAllScreenAssignments(const QHash< QString, QString > &assignments)
Batch setters - clear existing, set new, save once at end.
Layout * resolveLayoutForScreen(const QString &screenId) const override
Resolve layout for screenId using the current desktop/activity context.
Definition LayoutRegistry.h:324
Layout * activeLayout() const override
Definition LayoutRegistry.h:149
bool hasExplicitAssignment(const QString &screenId, int virtualDesktop=0, const QString &activity=QString()) const
True iff a context-assignment rule whose match is exactly this (screen, desktop, activity) tuple's sh...
void cycleToPreviousLayout(const QString &screenId)
void addLayout(Layout *layout) override
QHash< QPair< QString, int >, QString > desktopAssignments() const
Layout * layout(int index) const override
ContextOverlayOverride resolveContextOverlay(const QString &screenId, int virtualDesktop, const QString &activity) const override
Resolve the per-context overlay-property override (shader / style) for (screen, desktop,...
void setLayoutDirectory(const QString &directory)
void saveAutotileOverrides(const QString &algorithmId, const QJsonObject &overrides)
void setQuickLayoutSlot(AssignmentEntry::Mode mode, int number, const QString &layoutId)
void assignLayoutById(const QString &screenId, int virtualDesktop, const QString &activity, const QString &layoutId)
Layout * previousLayout() const
Get the previous active layout (before the most recent setActiveLayout).
Definition LayoutRegistry.h:302
void setSnappingPreferredProvider(std::function< bool()> provider)
Inject a callback that returns true when Snapping is the user's preferred default mode (regardless of...
int currentVirtualDesktopForScreen(const QString &screenId) const override
This screen's current virtual desktop, falling back to the global m_currentVirtualDesktop when no per...
Definition LayoutRegistry.h:542
void setCurrentActivity(const QString &activity)
Definition LayoutRegistry.h:560
Layout * defaultLayout() const override
Resolve the effective default layout.
void removeLayoutById(const QUuid &id) override
void clearAssignment(const QString &screenId, int virtualDesktop=0, const QString &activity=QString())
int contextResolveCacheSize() const
Current entry count in the resolveAssignmentEntry hot-path cache.
Definition LayoutRegistry.h:585
bool isContextActiveLayoutSuppressed(const QString &screenId, int virtualDesktop=0, const QString &activity=QString()) const override
True iff the context has NO active layout specifically because the default assignment is suppressed —...
void setCurrentVirtualDesktopForScreen(const QString &screenId, int desktop)
Record a single screen's current virtual desktop (per-output virtual desktops).
Definition LayoutRegistry.h:549
void clearAutotileAssignments()
Flip mode to Snapping for every entry currently in Autotile (preserves snappingLayout + tilingAlgorit...
void setCurrentVirtualDesktop(int desktop)
Definition LayoutRegistry.h:536
bool snappingPreferred() const
True when the snapping-preferred provider is wired AND reports true — i.e.
AssignmentEntry assignmentEntryForScreen(const QString &screenId, int virtualDesktop=0, const QString &activity=QString()) const
Full entry for a (screen, desktop, activity) context.
Layout * layoutByName(const QString &name) const override
Layout * layoutById(const QUuid &id) const override
Resolve a layout by its stable UUID.
void setAllQuickLayoutSlots(AssignmentEntry::Mode mode, const QHash< int, QString > &slots)
bool resolveContextLocked(const QString &screenId, int virtualDesktop, const QString &activity) const override
Resolve whether a context rule locks the active layout for the (screen, desktop, activity) context by...
void importLayout(const QString &filePath)
void removeLayout(Layout *layout) override
std::optional< bool > resolveContextDefaultAssignment(const QString &screenId, int virtualDesktop, const QString &activity) const
Resolve a per-context override of the global default-layout-assignment baseline for the (screen,...
QString currentActivity() const override
Definition LayoutRegistry.h:532
void seedDefaultLayoutSettingsIfFresh(const QJsonObject &defaults)
Seed curated default picker visibility into the sidecar, but ONLY on a fresh install — when neither l...
Layout * layoutForShortcut(AssignmentEntry::Mode mode, int number) const
void clearCurrentVirtualDesktopForScreen(const QString &screenId)
Drop a screen's per-output desktop, reverting it to the global value.
Definition LayoutRegistry.h:556
void setDefaultLayoutIdProvider(std::function< QString()> provider)
Inject a callback that returns the user-configured default layout id (or empty if unset).
void setDefaultAssignmentSuppressedProvider(std::function< bool()> provider)
Inject a callback that returns true when the user has opted to suppress the synthesized level-1 defau...
QHash< QPair< QString, QString >, QString > activityAssignments() const
void setDefaultAutotileAlgorithmProvider(std::function< QString()> provider)
Inject a callback that returns the user-configured default autotile algorithm id (or empty if autotil...
QJsonObject loadAutotileOverrides(const QString &algorithmId) const override
Per-algorithm autotile settings (gaps, shader, hiddenFromSelector, …) stored in the unified layout-se...
ContextGapOverride resolveContextGaps(const QString &screenId, int virtualDesktop, const QString &activity) const override
Resolve the per-context gap override for (screen, desktop, activity) by evaluating a windowless Windo...
QString tilingAlgorithmForScreen(const QString &screenId, int virtualDesktop=0, const QString &activity=QString()) const override
Raw id of the tiling algorithm active for the (screenId, virtualDesktop, activity) context,...
void saveLayout(Layout *layout)
QHash< CombinedAssignmentKey, QString > combinedAssignments() const
Strict Combined-context reader.
QVector< Layout * > builtInLayouts() const
void setActiveLayout(Layout *layout) override
void assignLayout(const QString &screenId, int virtualDesktop, const QString &activity, Layout *layout)
bool isDefaultAssignmentSuppressedForContext(const QString &screenId, int virtualDesktop=0, const QString &activity=QString()) const
True iff the SYNTHESIZED default (the level-1 provider layout / autotile algorithm) is suppressed for...
void setAllCombinedAssignments(const QHash< CombinedAssignmentKey, QString > &assignments)
Combined-context (screen + desktop + activity) batch setter — the triple-axis sibling of the Activity...
QVector< Layout * > layouts() const override
Enumerate every known layout.
Definition LayoutRegistry.h:136
Represents a collection of zones that form a layout.
Definition Layout.h:40
Definition IWindowTrackingService.h:23
size_t qHash(const LayoutAssignmentKey &key, size_t seed=0)
Definition AssignmentEntry.h:75
Explicit per-context assignment entry storing both mode fields.
Definition AssignmentEntry.h:91
Mode
Per-context engine selection.
Definition AssignmentEntry.h:100
Triple-axis key for the Combined-context batch API.
Definition LayoutRegistry.h:36
int virtualDesktop
Definition LayoutRegistry.h:38
QString activity
Definition LayoutRegistry.h:39
QString screenId
Definition LayoutRegistry.h:37
bool operator==(const CombinedAssignmentKey &other) const
Definition LayoutRegistry.h:41
Per-context gap override resolved from window rules.
Definition AssignmentEntry.h:188
Per-context overlay-property overrides resolved from window-rule actions.
Definition AssignmentEntry.h:220