From 20b2f8639eea6fa5bcda77b73cb71756db7c3016 Mon Sep 17 00:00:00 2001 From: Peter Fajdiga Date: Sat, 25 Feb 2023 23:59:47 +0100 Subject: [PATCH] WindowRuleEnforcer.ts --- src/WindowRuleEnforcer.ts | 34 ++++++++++++++++++++++++++++++++++ src/World.ts | 3 +++ src/actions.ts | 7 ------- src/constants.ts | 8 ++++---- src/signals/workspace.ts | 3 --- 5 files changed, 41 insertions(+), 14 deletions(-) create mode 100644 src/WindowRuleEnforcer.ts diff --git a/src/WindowRuleEnforcer.ts b/src/WindowRuleEnforcer.ts new file mode 100644 index 0000000..6baa62f --- /dev/null +++ b/src/WindowRuleEnforcer.ts @@ -0,0 +1,34 @@ +class WindowRuleEnforcer { + private preferFloating: ClientMatcher; + private preferTiling: ClientMatcher; + private workspaceSignalManager: SignalManager; + + constructor(world: World, preferFloating: Map, preferTiling: Map) { + this.preferFloating = new ClientMatcher(preferFloating); + this.preferTiling = new ClientMatcher(preferTiling); + this.workspaceSignalManager = this.initWorkspaceSignalHandlers(world); + } + + shouldTile(kwinClient: AbstractClient) { + return canTile(kwinClient) && ( + this.preferTiling.matches(kwinClient) || + kwinClient.normalWindow && kwinClient.managed && !this.preferFloating.matches(kwinClient) + ); + } + + initWorkspaceSignalHandlers(world: World) { + const manager = new SignalManager(); + + manager.connect(workspace.clientAdded, (kwinClient: AbstractClient) => { + if (this.shouldTile(kwinClient)) { + world.addClient(kwinClient); + } + }); + + return manager; + } + + destroy() { + this.workspaceSignalManager.disconnect(); + } +} diff --git a/src/World.ts b/src/World.ts index 46ec3b9..593756c 100644 --- a/src/World.ts +++ b/src/World.ts @@ -4,6 +4,7 @@ class World { public minimizedTiled: Set; // TODO: implement using `clientMap` private lastFocusedClient: AbstractClient|null; private workspaceSignalManager: SignalManager; + private windowRuleEnforcer: WindowRuleEnforcer; private screenResizedDelayer: Delayer; constructor() { @@ -12,6 +13,7 @@ class World { this.minimizedTiled = new Set(); this.lastFocusedClient = null; this.workspaceSignalManager = initWorkspaceSignalHandlers(this); + this.windowRuleEnforcer = new WindowRuleEnforcer(this, PREFER_FLOATING, PREFER_TILING); this.screenResizedDelayer = new Delayer(1000, () => { // this delay ensures that docks get taken into account by `workspace.clientArea` const grids = this.grids; // workaround for bug in Qt5's JS engine @@ -141,6 +143,7 @@ class World { destroy() { this.workspaceSignalManager.disconnect(); + this.windowRuleEnforcer.destroy(); this.removeAllClients(); for (const grid of this.grids) { grid.destroy(); diff --git a/src/actions.ts b/src/actions.ts index 80c0b98..227f202 100644 --- a/src/actions.ts +++ b/src/actions.ts @@ -326,10 +326,3 @@ function canTile(kwinClient: AbstractClient) { // TODO: support windows on all desktops return kwinClient.resizeable && !kwinClient.minimized && kwinClient.desktop > 0; } - -function shouldTile(kwinClient: AbstractClient) { - return canTile(kwinClient) && ( - PREFER_TILING.matches(kwinClient) || - kwinClient.normalWindow && kwinClient.managed && !PREFER_FLOATING.matches(kwinClient) - ); -} diff --git a/src/constants.ts b/src/constants.ts index 6bd2934..ff673aa 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -3,14 +3,14 @@ const GAPS_INNER = { x: 12, y: 12 }; const AUTO_OVERSCROLL_X = 12; const GRID_SCROLL_STEP = 200; const STACKED_BY_DEFAULT = false; -const PREFER_FLOATING = new ClientMatcher(new Map(Object.entries({ +const PREFER_FLOATING = new Map(Object.entries({ "ksmserver-logout-greeter": new RegExp(""), "kcalc": new RegExp(""), "kruler": new RegExp(""), "zoom": new RegExp("^(Zoom Cloud Meetings|zoom)$"), "jetbrains-idea": new RegExp("^splash$"), -}))); -const PREFER_TILING = new ClientMatcher(new Map(Object.entries({ +})); +const PREFER_TILING = new Map(Object.entries({ "kfind": new RegExp(""), "jetbrains-idea": new RegExp("^(Unstash Changes|Paths Affected by stash@.*)$"), -}))); +})); diff --git a/src/signals/workspace.ts b/src/signals/workspace.ts index c9eea4c..a94f97a 100644 --- a/src/signals/workspace.ts +++ b/src/signals/workspace.ts @@ -33,9 +33,6 @@ function initWorkspaceSignalHandlers(world: World) { world.onScreenResized(); return; } - if (shouldTile(kwinClient)) { - world.addClient(kwinClient); - } }); manager.connect(workspace.clientRemoved, (kwinClient: AbstractClient) => {