diff --git a/src/lib/extern/kwin.ts b/src/lib/extern/kwin.ts index a91a27c..100cc9e 100644 --- a/src/lib/extern/kwin.ts +++ b/src/lib/extern/kwin.ts @@ -18,8 +18,9 @@ type Workspace = { readonly windowAdded: QSignal<[KwinClient]>; readonly windowRemoved: QSignal<[KwinClient]>; readonly windowActivated: QSignal<[KwinClient]>; - readonly desktopsChanged: QSignal<[]>; + readonly screensChanged: QSignal<[]>; readonly activitiesChanged: QSignal<[]>; + readonly desktopsChanged: QSignal<[]>; readonly currentActivityChanged: QSignal<[]>; readonly virtualScreenSizeChanged: QSignal<[]>; diff --git a/src/lib/workspace.ts b/src/lib/workspace.ts index d1b6a2d..8d1c26c 100644 --- a/src/lib/workspace.ts +++ b/src/lib/workspace.ts @@ -34,19 +34,25 @@ function initWorkspaceSignalHandlers(world: World) { world.do(() => {}); // re-arrange desktop }); + manager.connect(Workspace.screensChanged, () => { + world.do((clientManager, desktopManager) => { + desktopManager.updateScreens(); + }) + }); + + manager.connect(Workspace.activitiesChanged, () => { + world.do((clientManager, desktopManager) => { + desktopManager.updateActivities(); + }) + }); + manager.connect(Workspace.desktopsChanged, () => { world.do((clientManager, desktopManager) => { desktopManager.updateDesktops(); }) }); - manager.connect(Workspace.activitiesChanged, () => { - world.do((clientManager, desktopManager) => { - desktopManager.updateActivities(); - }) - }); - - manager.connect(Workspace.virtualScreenSizeChanged, () => { + manager.connect(Workspace.virtualScreenSizeChanged, () => { world.onScreenResized(); }); diff --git a/src/lib/world/DesktopManager.ts b/src/lib/world/DesktopManager.ts index b9dec25..31a5794 100644 --- a/src/lib/world/DesktopManager.ts +++ b/src/lib/world/DesktopManager.ts @@ -61,6 +61,16 @@ class DesktopManager { return screen.name + "|" + activity + "|" + kwinDesktop.id; } + public updateScreens() { + const newScreens = new Set(Workspace.screens); + for (const screen of this.kwinScreens) { + if (!newScreens.has(screen)) { + this.removeScreen(screen); + } + } + this.kwinScreens = newScreens; + } + public updateActivities() { const newActivities = new Set(Workspace.activities); for (const activity of this.kwinActivities) { @@ -81,6 +91,14 @@ class DesktopManager { this.kwinDesktops = newDesktops; } + private removeScreen(kwinScreen: Output) { + for (const activity of this.kwinActivities) { + for (const kwinDesktop of this.kwinDesktops) { + this.destroyDesktop(kwinScreen, activity, kwinDesktop); + } + } + } + private removeActivity(activity: string) { for (const kwinScreen of this.kwinScreens) { for (const kwinDesktop of this.kwinDesktops) {