From 0501619ae63ad3a61c5c9c4ec5280a126831c16e Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Mon, 8 Jul 2024 22:35:37 +0700 Subject: [PATCH] Handle dynamic monitors --- modules/wm/ags/config.js | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/modules/wm/ags/config.js b/modules/wm/ags/config.js index 64bacd5..48db407 100644 --- a/modules/wm/ags/config.js +++ b/modules/wm/ags/config.js @@ -7,11 +7,33 @@ import Gtk from "gi://Gtk?version=3.0"; import Gdk from "gi://Gdk"; /** - * @param {(monitor: number) => Gtk.Window} widget + * @param {Array<(monitor: number) => Gtk.Window>} widgets */ -export function forMonitors(widget) { - const n = Gdk.Display.get_default()?.get_n_monitors() || 1; - return Array.from({ length: n }, (_, i) => i).flatMap(widget); +export function forMonitors(widgets) { + const display = Gdk.Display.get_default(); + + display?.connect("monitor-added", (disp, gdkmonitor) => { + let monitor = 0; + for (let i = 0; i < display.get_n_monitors(); i++) { + if (gdkmonitor === display.get_monitor(i)) { + monitor = i; + break; + } + } + + widgets.forEach((win) => App.addWindow(win(monitor))); + }); + + display?.connect("monitor-removed", (disp, monitor) => { + App.windows.forEach((win) => { + if (win.gdkmonitor === monitor) App.removeWindow(win); + }); + }); + + const n = display?.get_n_monitors() || 1; + return Array.from({ length: n }, (_, i) => i).flatMap((mon) => + widgets.map((x) => x(mon)), + ); } App.config({ @@ -21,10 +43,5 @@ App.config({ osd: 300, }, style: `${App.configDir}/style.css`, - windows: [ - ...forMonitors(Bar), - Quicksettings(), - Notifications(), - OSD(), - ], + windows: [...forMonitors([Bar]), Quicksettings(), Notifications(), OSD()], });