From d8aca6ab487dc4a8f2d519d568ed7fcd6ac35fc6 Mon Sep 17 00:00:00 2001 From: bbedward Date: Sat, 10 Oct 2026 17:30:01 -0400 Subject: [PATCH] grids: hand committed layouts and display picks to callbacks, not var signals fixes #3746 --- .../Modules/ControlCenter/Components/CcTileGrid.qml | 2 +- quickshell/Modules/DDash/DashWidgetGrid.qml | 2 +- quickshell/Modules/DDash/Overview/DashCardGrid.qml | 2 +- quickshell/Modules/Settings/DBarTab.qml | 4 ++-- quickshell/Modules/Settings/DDotTab.qml | 2 +- .../DesktopWidgetInstanceSettings.qml | 2 +- quickshell/Modules/Settings/DisplayWidgetsTab.qml | 2 +- quickshell/Modules/Settings/DockGeneralTab.qml | 2 +- quickshell/Modules/Settings/LockScreenTab.qml | 2 +- .../Modules/Settings/Widgets/SettingsDisplayPicker.qml | 7 ++++--- quickshell/Services/AqueousService.qml | 2 +- quickshell/Services/DMSNetworkService.qml | 4 ++-- quickshell/Widgets/DEditableGrid.qml | 8 ++++---- 13 files changed, 21 insertions(+), 20 deletions(-) diff --git a/quickshell/Modules/ControlCenter/Components/CcTileGrid.qml b/quickshell/Modules/ControlCenter/Components/CcTileGrid.qml index c346b60a1..b4925cab9 100644 --- a/quickshell/Modules/ControlCenter/Components/CcTileGrid.qml +++ b/quickshell/Modules/ControlCenter/Components/CcTileGrid.qml @@ -46,7 +46,7 @@ DEditableGrid { packer: items => GridUtils.packCells(clamped(items), placementOrder, columns, null, CcMetrics.gridStep, true).cells placeholderRadius: draggingSlot?.small ? Theme.fullRadius(draggingSlot.width, draggingSlot.height) : (draggingSlot?.tileItem?.bodyRadius ?? Theme.fullRadius(width, CcMetrics.tileHeight)) - onLayoutCommitted: items => model.setLayout(withHidden(items)) + commitHandler: items => model.setLayout(withHidden(items)) function clamped(items) { return items.map(widget => Object.assign({}, widget, WidgetUtils.clampSize(widget, columns, maximumRows))); diff --git a/quickshell/Modules/DDash/DashWidgetGrid.qml b/quickshell/Modules/DDash/DashWidgetGrid.qml index 4e4f44ccd..07fc21394 100644 --- a/quickshell/Modules/DDash/DashWidgetGrid.qml +++ b/quickshell/Modules/DDash/DashWidgetGrid.qml @@ -130,7 +130,7 @@ Item { editMode: root.editMode sourceItems: root.widgets slotLayout: GridUtils.packCards(layoutItems, placementOrder, root.columns, width, DashMetrics.gridGap, DashMetrics.gridRowUnit, I18n.isRtl, id => root.specFor(id) !== null) - onLayoutCommitted: items => root.save(WidgetUtils.resolve(root.definitions, items)) + commitHandler: items => root.save(WidgetUtils.resolve(root.definitions, items)) function requestFocus(backwards) { const targets = root.focusTargets(); diff --git a/quickshell/Modules/DDash/Overview/DashCardGrid.qml b/quickshell/Modules/DDash/Overview/DashCardGrid.qml index 0a9e631f7..099d966e6 100644 --- a/quickshell/Modules/DDash/Overview/DashCardGrid.qml +++ b/quickshell/Modules/DDash/Overview/DashCardGrid.qml @@ -41,7 +41,7 @@ DEditableGrid { minimumHeight: DashMetrics.tabMinHeight placeholderRadius: DashMetrics.cardRadius - onLayoutCommitted: items => { + commitHandler: items => { commitPanelPreview(); CardUtils.setLayout(items); } diff --git a/quickshell/Modules/Settings/DBarTab.qml b/quickshell/Modules/Settings/DBarTab.qml index eaaf6c480..cdb3e8087 100644 --- a/quickshell/Modules/Settings/DBarTab.qml +++ b/quickshell/Modules/Settings/DBarTab.qml @@ -222,7 +222,7 @@ Item { allowEmpty: true showLastDisplay: true showOnLastDisplay: bar.selectedBarConfig?.showOnLastDisplay ?? true - onPreferencesChanged: prefs => dankBarTab.setBarScreenPreferences(bar.selectedBarId, prefs) + preferencesHandler: prefs => dankBarTab.setBarScreenPreferences(bar.selectedBarId, prefs) onLastDisplayToggled: checked => dankBarTab.setBarShowOnLastDisplay(bar.selectedBarId, checked) } } @@ -412,7 +412,7 @@ Item { SettingsDisplayPicker { displayPreferences: SettingsData.frameScreenPreferences - onPreferencesChanged: prefs => SettingsData.set("frameScreenPreferences", prefs) + preferencesHandler: prefs => SettingsData.set("frameScreenPreferences", prefs) } } diff --git a/quickshell/Modules/Settings/DDotTab.qml b/quickshell/Modules/Settings/DDotTab.qml index c6223a2a2..ac5946de2 100644 --- a/quickshell/Modules/Settings/DDotTab.qml +++ b/quickshell/Modules/Settings/DDotTab.qml @@ -165,7 +165,7 @@ Item { allowEmpty: true showLastDisplay: true showOnLastDisplay: dot.config?.showOnLastDisplay ?? true - onPreferencesChanged: prefs => dot.apply("screenPreferences", prefs) + preferencesHandler: prefs => dot.apply("screenPreferences", prefs) onLastDisplayToggled: checked => dot.apply("showOnLastDisplay", checked) } } diff --git a/quickshell/Modules/Settings/DesktopWidgetSettings/DesktopWidgetInstanceSettings.qml b/quickshell/Modules/Settings/DesktopWidgetSettings/DesktopWidgetInstanceSettings.qml index 315f83fd4..819dc4e0e 100644 --- a/quickshell/Modules/Settings/DesktopWidgetSettings/DesktopWidgetInstanceSettings.qml +++ b/quickshell/Modules/Settings/DesktopWidgetSettings/DesktopWidgetInstanceSettings.qml @@ -55,7 +55,7 @@ Column { SettingsDisplayPicker { displayPreferences: root.cfg.displayPreferences ?? ["all"] - onPreferencesChanged: prefs => root.updateConfig("displayPreferences", prefs) + preferencesHandler: prefs => root.updateConfig("displayPreferences", prefs) } SettingsRow { diff --git a/quickshell/Modules/Settings/DisplayWidgetsTab.qml b/quickshell/Modules/Settings/DisplayWidgetsTab.qml index 7080b6485..bb2a56c87 100644 --- a/quickshell/Modules/Settings/DisplayWidgetsTab.qml +++ b/quickshell/Modules/Settings/DisplayWidgetsTab.qml @@ -154,7 +154,7 @@ Item { allowEmpty: true showLastDisplay: ["notifications", "osd", "toast", "notepad"].includes(componentCard.modelData.id) || componentCard.modelData.id.startsWith("bar:") showOnLastDisplay: root.getShowOnLastDisplay(componentCard.modelData.id) - onPreferencesChanged: prefs => root.setScreenPreferences(componentCard.modelData.id, prefs) + preferencesHandler: prefs => root.setScreenPreferences(componentCard.modelData.id, prefs) onLastDisplayToggled: checked => root.setShowOnLastDisplay(componentCard.modelData.id, checked) } diff --git a/quickshell/Modules/Settings/DockGeneralTab.qml b/quickshell/Modules/Settings/DockGeneralTab.qml index 46d2c7113..cf12df2de 100644 --- a/quickshell/Modules/Settings/DockGeneralTab.qml +++ b/quickshell/Modules/Settings/DockGeneralTab.qml @@ -24,7 +24,7 @@ Item { SettingsDisplayPicker { displayPreferences: dock.screenPreferences emptyMeansAll: false - onPreferencesChanged: preferences => dock.setOption("screenPreferences", preferences) + preferencesHandler: preferences => dock.setOption("screenPreferences", preferences) } SettingsToggleRow { diff --git a/quickshell/Modules/Settings/LockScreenTab.qml b/quickshell/Modules/Settings/LockScreenTab.qml index 5c3b93fcc..f2ed33e31 100644 --- a/quickshell/Modules/Settings/LockScreenTab.qml +++ b/quickshell/Modules/Settings/LockScreenTab.qml @@ -667,7 +667,7 @@ Item { SettingsDisplayPicker { width: parent.width displayPreferences: SettingsData.screenPreferences?.lockScreen || ["all"] - onPreferencesChanged: prefs => { + preferencesHandler: prefs => { var p = SettingsData.screenPreferences || {}; var updated = Object.assign({}, p); updated["lockScreen"] = prefs; diff --git a/quickshell/Modules/Settings/Widgets/SettingsDisplayPicker.qml b/quickshell/Modules/Settings/Widgets/SettingsDisplayPicker.qml index d6476ac76..b6e2a3cc6 100644 --- a/quickshell/Modules/Settings/Widgets/SettingsDisplayPicker.qml +++ b/quickshell/Modules/Settings/Widgets/SettingsDisplayPicker.qml @@ -14,7 +14,8 @@ Column { property bool showOnLastDisplay: false readonly property bool localAllDisplays: !Array.isArray(displayPreferences) || displayPreferences.includes("all") || (emptyMeansAll && displayPreferences.length === 0) - signal preferencesChanged(var preferences) + // A callback, not a signal: Qt 6.12 hands signal array parameters over as a V4Sequence that fails Array.isArray. + property var preferencesHandler: null signal lastDisplayToggled(bool checked) width: parent?.width ?? 0 @@ -34,7 +35,7 @@ Column { SettingsToggleRow { text: I18n.tr("All displays") checked: root.localAllDisplays - onToggled: checked => root.preferencesChanged(checked ? ["all"] : Quickshell.screens.map(screen => root.screenPref(screen))) + onToggled: checked => root.preferencesHandler?.(checked ? ["all"] : Quickshell.screens.map(screen => root.screenPref(screen))) } SettingsToggleRow { @@ -61,7 +62,7 @@ Column { prefs.push(root.screenPref(modelData)); if (!root.allowEmpty && prefs.length === 0) return; - root.preferencesChanged(prefs); + root.preferencesHandler?.(prefs); } } } diff --git a/quickshell/Services/AqueousService.qml b/quickshell/Services/AqueousService.qml index 4d8d068f0..e00b48208 100644 --- a/quickshell/Services/AqueousService.qml +++ b/quickshell/Services/AqueousService.qml @@ -107,7 +107,7 @@ Singleton { valid = typeof value === "number" && Number.isFinite(value); break; case "a": - valid = Array.isArray(value) && value.every(v => typeof v === "string"); + valid = value instanceof Array && value.every(v => typeof v === "string"); break; case "r": valid = value && ["x", "y", "width", "height"].every(k => Number.isSafeInteger(value[k])); diff --git a/quickshell/Services/DMSNetworkService.qml b/quickshell/Services/DMSNetworkService.qml index b92a2b576..63f252042 100644 --- a/quickshell/Services/DMSNetworkService.qml +++ b/quickshell/Services/DMSNetworkService.qml @@ -363,7 +363,7 @@ Singleton { } function keepUnchanged(previous, next) { - if (!Array.isArray(previous) || !Array.isArray(next)) + if (!(previous instanceof Array) || !(next instanceof Array)) return next; const byContent = new Map(); for (const item of previous) @@ -390,7 +390,7 @@ Singleton { if (!state.wifiNetworks && !state.savedWifiNetworks) return; - const hasSavedWifiState = DMSService.apiVersion >= savedWifiStateApiVersion && Array.isArray(state.savedWifiNetworks); + const hasSavedWifiState = DMSService.apiVersion >= savedWifiStateApiVersion && state.savedWifiNetworks instanceof Array; const sourceSavedNetworks = hasSavedWifiState ? state.savedWifiNetworks : (state.wifiNetworks || []).filter(network => network.saved); const normalized = sourceSavedNetworks.map(network => Object.assign({}, network, { saved: true, diff --git a/quickshell/Widgets/DEditableGrid.qml b/quickshell/Widgets/DEditableGrid.qml index b461c7907..e34ecdbca 100644 --- a/quickshell/Widgets/DEditableGrid.qml +++ b/quickshell/Widgets/DEditableGrid.qml @@ -32,6 +32,8 @@ Item { property var dropHandler: null // An item hovering from outside, placed first so the grid makes room for it. property var externalItem: null + // A callback, not a signal: Qt 6.12 hands signal array parameters over as a V4Sequence that fails Array.isArray. + property var commitHandler: null // The layout compacts upward, so a drop has to account for the hole the dragged item leaves. property bool gravity: false // Takes the items with the dragged one at its target and returns their packed cells, so a drop can tell @@ -62,8 +64,6 @@ Item { return gravity && dragCell && draggingSourceIndex >= 0 ? GridUtils.dropInto(changed, pinnedCells, draggingSourceIndex, dragCell, packer, rowStep) : changed; } - signal layoutCommitted(var items) - implicitHeight: Math.max(minimumHeight, layoutHeight) + contentPadding * 2 height: implicitHeight @@ -156,7 +156,7 @@ Item { const moved = pinnedCells.some((cell, i) => cell && (cell.col !== items[i].col || cell.row !== items[i].row)); cancelInteraction(); if (moved) - layoutCommitted(items); + commitHandler?.(items); } function previewExternal(item, x, y) { @@ -196,7 +196,7 @@ Item { const changed = item && Object.keys(preview.changes).some(key => item[key] !== preview.changes[key]); const items = committedItems(); if (changed) - layoutCommitted(items); + commitHandler?.(items); cancelInteraction(); }