WindowRuleEnforcer.ts: listen to changes in window captions

This commit is contained in:
Peter Fajdiga
2023-02-26 15:27:18 +01:00
parent 20b2f8639e
commit dfc78e1497

View File

@@ -1,12 +1,16 @@
class WindowRuleEnforcer {
private preferFloating: ClientMatcher;
private preferTiling: ClientMatcher;
private followCaption: Set<string>;
private workspaceSignalManager: SignalManager;
private clientSignalManagers: Map<AbstractClient, SignalManager>;
constructor(world: World, preferFloating: Map<string, RegExp>, preferTiling: Map<string, RegExp>) {
this.preferFloating = new ClientMatcher(preferFloating);
this.preferTiling = new ClientMatcher(preferTiling);
this.followCaption = new Set([...preferFloating.keys(), ...preferTiling.keys()]);
this.workspaceSignalManager = this.initWorkspaceSignalHandlers(world);
this.clientSignalManagers = new Map();
}
shouldTile(kwinClient: AbstractClient) {
@@ -17,18 +21,55 @@ class WindowRuleEnforcer {
}
initWorkspaceSignalHandlers(world: World) {
const enforcer = this;
const manager = new SignalManager();
manager.connect(workspace.clientAdded, (kwinClient: AbstractClient) => {
if (this.shouldTile(kwinClient)) {
if (enforcer.shouldTile(kwinClient)) {
world.addClient(kwinClient);
}
if (enforcer.followCaption.has(kwinClient.resourceClass)) {
enforcer.addClientSignalManager(world, kwinClient);
}
});
manager.connect(workspace.clientRemoved, (kwinClient: AbstractClient) => {
this.removeClientSignalManager(kwinClient);
});
return manager;
}
addClientSignalManager(world: World, kwinClient: AbstractClient) {
const enforcer = this;
const manager = new SignalManager();
manager.connect(kwinClient.captionChanged, () => {
const shouldTile = enforcer.shouldTile(kwinClient);
const isTiled = world.hasClient(kwinClient);
if (isTiled && !shouldTile) {
world.removeClient(kwinClient, false);
} else if (!isTiled && shouldTile) {
world.addClient(kwinClient);
}
});
this.clientSignalManagers.set(kwinClient, manager);
}
removeClientSignalManager(kwinClient: AbstractClient) {
const manager = this.clientSignalManagers.get(kwinClient);
if (manager !== undefined) {
manager.disconnect();
this.clientSignalManagers.delete(kwinClient);
}
}
destroy() {
this.workspaceSignalManager.disconnect();
for (const clientSignalManager of this.clientSignalManagers.values()) {
clientSignalManager.disconnect();
}
this.clientSignalManagers.clear();
}
}