1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-04-03 20:32:07 -04:00

(frame): Multi-monitor support

This commit is contained in:
purian23
2026-03-31 15:16:24 -04:00
parent 220bb2708b
commit e913630f90
6 changed files with 28 additions and 25 deletions

View File

@@ -1974,14 +1974,6 @@ Singleton {
return Quickshell.screens.filter(screen => isScreenInPreferences(screen, prefs)); return Quickshell.screens.filter(screen => isScreenInPreferences(screen, prefs));
} }
function getFrameScreensAlways() {
const prefs = frameScreenPreferences;
if (!prefs || prefs.length === 0 || prefs.includes("all")) {
return Quickshell.screens;
}
return Quickshell.screens.filter(s => prefs.includes(s.name));
}
function getActiveBarEdgeForScreen(screen) { function getActiveBarEdgeForScreen(screen) {
if (!screen) return ""; if (!screen) return "";
for (var i = 0; i < barConfigs.length; i++) { for (var i = 0; i < barConfigs.length; i++) {

View File

@@ -7,10 +7,10 @@ import qs.Common
Variants { Variants {
id: root id: root
model: SettingsData.getFrameScreensAlways() model: Quickshell.screens
FrameInstance { FrameInstance {
required property ShellScreen modelData required property var modelData
screen: modelData screen: modelData
} }

View File

@@ -8,7 +8,7 @@ import qs.Common
Scope { Scope {
id: root id: root
required property ShellScreen screen required property var screen
readonly property var barEdges: { readonly property var barEdges: {
SettingsData.barConfigs; // force re-eval when bar configs change SettingsData.barConfigs; // force re-eval when bar configs change
@@ -18,10 +18,12 @@ Scope {
// One thin invisible PanelWindow per edge. // One thin invisible PanelWindow per edge.
// Skips any edge where a bar already provides its own exclusiveZone. // Skips any edge where a bar already provides its own exclusiveZone.
readonly property bool screenEnabled: SettingsData.frameEnabled && SettingsData.isScreenInPreferences(root.screen, SettingsData.frameScreenPreferences)
Loader { Loader {
active: SettingsData.frameEnabled && !root.barEdges.includes("top") active: root.screenEnabled && !root.barEdges.includes("top")
sourceComponent: EdgeExclusion { sourceComponent: EdgeExclusion {
screen: root.screen targetScreen: root.screen
anchorTop: true anchorTop: true
anchorLeft: true anchorLeft: true
anchorRight: true anchorRight: true
@@ -29,9 +31,9 @@ Scope {
} }
Loader { Loader {
active: SettingsData.frameEnabled && !root.barEdges.includes("bottom") active: root.screenEnabled && !root.barEdges.includes("bottom")
sourceComponent: EdgeExclusion { sourceComponent: EdgeExclusion {
screen: root.screen targetScreen: root.screen
anchorBottom: true anchorBottom: true
anchorLeft: true anchorLeft: true
anchorRight: true anchorRight: true
@@ -39,9 +41,9 @@ Scope {
} }
Loader { Loader {
active: SettingsData.frameEnabled && !root.barEdges.includes("left") active: root.screenEnabled && !root.barEdges.includes("left")
sourceComponent: EdgeExclusion { sourceComponent: EdgeExclusion {
screen: root.screen targetScreen: root.screen
anchorLeft: true anchorLeft: true
anchorTop: true anchorTop: true
anchorBottom: true anchorBottom: true
@@ -49,9 +51,9 @@ Scope {
} }
Loader { Loader {
active: SettingsData.frameEnabled && !root.barEdges.includes("right") active: root.screenEnabled && !root.barEdges.includes("right")
sourceComponent: EdgeExclusion { sourceComponent: EdgeExclusion {
screen: root.screen targetScreen: root.screen
anchorRight: true anchorRight: true
anchorTop: true anchorTop: true
anchorBottom: true anchorBottom: true
@@ -59,7 +61,9 @@ Scope {
} }
component EdgeExclusion: PanelWindow { component EdgeExclusion: PanelWindow {
required property ShellScreen screen required property var targetScreen
screen: targetScreen
property bool anchorTop: false property bool anchorTop: false
property bool anchorBottom: false property bool anchorBottom: false
property bool anchorLeft: false property bool anchorLeft: false

View File

@@ -6,10 +6,10 @@ import Quickshell
Item { Item {
id: root id: root
required property ShellScreen screen required property var screen
FrameWindow { FrameWindow {
screen: root.screen targetScreen: root.screen
} }
FrameExclusions { FrameExclusions {

View File

@@ -8,7 +8,10 @@ import qs.Common
PanelWindow { PanelWindow {
id: win id: win
required property ShellScreen screen required property var targetScreen
screen: targetScreen
visible: true
WlrLayershell.namespace: "dms:frame" WlrLayershell.namespace: "dms:frame"
WlrLayershell.layer: WlrLayer.Top WlrLayershell.layer: WlrLayer.Top
@@ -28,7 +31,7 @@ PanelWindow {
FrameBorder { FrameBorder {
anchors.fill: parent anchors.fill: parent
visible: SettingsData.frameEnabled visible: SettingsData.frameEnabled && SettingsData.isScreenInPreferences(win.screen, SettingsData.frameScreenPreferences)
barEdges: { SettingsData.barConfigs; return SettingsData.getActiveBarEdgesForScreen(win.screen); } barEdges: { SettingsData.barConfigs; return SettingsData.getActiveBarEdgesForScreen(win.screen); }
} }
} }

View File

@@ -83,7 +83,6 @@ Item {
description: modelData.width + "×" + modelData.height description: modelData.width + "×" + modelData.height
checked: localChecked checked: localChecked
onToggled: isChecked => { onToggled: isChecked => {
localChecked = isChecked;
var prefs = JSON.parse(JSON.stringify(root.displayPreferences)); var prefs = JSON.parse(JSON.stringify(root.displayPreferences));
if (!Array.isArray(prefs) || prefs.includes("all")) if (!Array.isArray(prefs) || prefs.includes("all"))
prefs = []; prefs = [];
@@ -94,6 +93,11 @@ Item {
model: modelData.model || "" model: modelData.model || ""
}); });
} }
if (prefs.length === 0) {
localChecked = true;
return;
}
localChecked = isChecked;
root.preferencesChanged(prefs); root.preferencesChanged(prefs);
} }
} }