From dfc78e1497662556d087626c23ec0794b98bfa95 Mon Sep 17 00:00:00 2001 From: Peter Fajdiga Date: Sun, 26 Feb 2023 15:27:18 +0100 Subject: [PATCH] WindowRuleEnforcer.ts: listen to changes in window captions --- src/WindowRuleEnforcer.ts | 43 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/WindowRuleEnforcer.ts b/src/WindowRuleEnforcer.ts index 6baa62f..9a3452d 100644 --- a/src/WindowRuleEnforcer.ts +++ b/src/WindowRuleEnforcer.ts @@ -1,12 +1,16 @@ class WindowRuleEnforcer { private preferFloating: ClientMatcher; private preferTiling: ClientMatcher; + private followCaption: Set; private workspaceSignalManager: SignalManager; + private clientSignalManagers: Map; constructor(world: World, preferFloating: Map, preferTiling: Map) { 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(); } }