Phosphor
Qt6 / Wayland library suite for window-management tools
 
Loading...
Searching...
No Matches
FloatingCache.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
8#include <QSet>
9#include <QString>
10
11namespace PhosphorCompositor {
12
38{
39public:
40 bool isFloating(const QString& windowId) const
41 {
42 // Instance-specific float — survives appId (class) mutation.
43 if (m_byInstance.contains(::PhosphorIdentity::WindowId::extractInstanceId(windowId))) {
44 return true;
45 }
46 // App-wide float — a bare appId matches every instance of that app.
47 return m_byAppId.contains(::PhosphorIdentity::WindowId::extractAppId(windowId));
48 }
49
50 void setFloating(const QString& windowId, bool floating)
51 {
52 const QString appId = ::PhosphorIdentity::WindowId::extractAppId(windowId);
53 const bool isComposite = (appId != windowId); // bare appId has no separator
54 if (isComposite) {
55 const QString instanceId = ::PhosphorIdentity::WindowId::extractInstanceId(windowId);
56 // A composite with an empty instanceId ("appId|") is malformed: keying
57 // it would alias every other empty-instance window onto one wildcard
58 // slot. Reject rather than corrupt the cache.
59 if (instanceId.isEmpty()) {
60 return;
61 }
62 if (floating) {
63 m_byInstance.insert(instanceId);
64 } else {
65 m_byInstance.remove(instanceId);
66 // Mirror WindowTrackingService::setFloating: an explicit instance
67 // unfloat also drops the coarse app-wide fallback. Siblings keep
68 // their own instance entries, so this only clears the appId marker.
69 m_byAppId.remove(appId);
70 }
71 } else if (floating) {
72 m_byAppId.insert(windowId);
73 } else {
74 m_byAppId.remove(windowId);
75 }
76 }
77
78 void clear()
79 {
80 m_byInstance.clear();
81 m_byAppId.clear();
82 }
83
89 int size() const
90 {
91 return m_byInstance.size() + m_byAppId.size();
92 }
93
96 void insert(const QString& windowId)
97 {
98 setFloating(windowId, true);
99 }
100
102 void remove(const QString& windowId)
103 {
104 setFloating(windowId, false);
105 }
106
107private:
108 QSet<QString> m_byInstance;
109 QSet<QString> m_byAppId;
110};
111
112} // namespace PhosphorCompositor
Compositor-agnostic floating window state cache.
Definition FloatingCache.h:38
void remove(const QString &windowId)
Convenience alias for setFloating(windowId, false).
Definition FloatingCache.h:102
void setFloating(const QString &windowId, bool floating)
Definition FloatingCache.h:50
void clear()
Definition FloatingCache.h:78
int size() const
Total entries across BOTH keyspaces (instance floats + app-wide floats).
Definition FloatingCache.h:89
void insert(const QString &windowId)
Convenience alias for setFloating(windowId, true).
Definition FloatingCache.h:96
bool isFloating(const QString &windowId) const
Definition FloatingCache.h:40
Definition AutotileState.h:17
QString extractInstanceId(const QString &windowId)
Extract the stable KWin instance identifier (UUID) from a full window ID.
Definition WindowId.h:75
QString extractAppId(const QString &windowId)
Extract app identity from window ID (portion before the '|' separator) Format: "appId|internalUuid" →...
Definition WindowId.h:56