mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-05-04 03:22:12 -04:00
@@ -84,19 +84,51 @@ Singleton {
|
|||||||
return Pipewire.nodes.values.filter(node => node.audio && node.isSink && !node.isStream && !hidden.includes(node.name));
|
return Pipewire.nodes.values.filter(node => node.audio && node.isSink && !node.isStream && !hidden.includes(node.name));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Resolve a PwNode by name from the live typed list and assign it as the
|
property list<PwNode> typedSinks: []
|
||||||
// default sink. Going through Pipewire.nodes.values directly (no .filter
|
property list<PwNode> typedSources: []
|
||||||
// / spread / .sort / property var) avoids QML type erasure to QObject*,
|
|
||||||
// which newer quickshell rejects when assigning to preferredDefaultAudioSink.
|
function rebuildTypedNodeLists() {
|
||||||
|
const newSinks = [];
|
||||||
|
const newSources = [];
|
||||||
|
for (const node of Pipewire.nodes.values) {
|
||||||
|
if (!node?.audio || node.isStream)
|
||||||
|
continue;
|
||||||
|
if (node.isSink)
|
||||||
|
newSinks.push(node);
|
||||||
|
else
|
||||||
|
newSources.push(node);
|
||||||
|
}
|
||||||
|
typedSinks = newSinks;
|
||||||
|
typedSources = newSources;
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: Pipewire.nodes
|
||||||
|
function onValuesChanged() {
|
||||||
|
root.rebuildTypedNodeLists();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setSink(node: PwNode): bool {
|
||||||
|
if (!node)
|
||||||
|
return false;
|
||||||
|
Pipewire.preferredDefaultAudioSink = node;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function setSource(node: PwNode): bool {
|
||||||
|
if (!node)
|
||||||
|
return false;
|
||||||
|
Pipewire.preferredDefaultAudioSource = node;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
function setDefaultSinkByName(name) {
|
function setDefaultSinkByName(name) {
|
||||||
if (!name)
|
if (!name)
|
||||||
return false;
|
return false;
|
||||||
for (let i = 0; i < Pipewire.nodes.values.length; i++) {
|
for (const node of typedSinks) {
|
||||||
const node = Pipewire.nodes.values[i];
|
if (node?.name === name)
|
||||||
if (node && node.name === name && node.audio && node.isSink && !node.isStream) {
|
return setSink(node);
|
||||||
Pipewire.preferredDefaultAudioSink = node;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -104,12 +136,9 @@ Singleton {
|
|||||||
function setDefaultSourceByName(name) {
|
function setDefaultSourceByName(name) {
|
||||||
if (!name)
|
if (!name)
|
||||||
return false;
|
return false;
|
||||||
for (let i = 0; i < Pipewire.nodes.values.length; i++) {
|
for (const node of typedSources) {
|
||||||
const node = Pipewire.nodes.values[i];
|
if (node?.name === name)
|
||||||
if (node && node.name === name && node.audio && !node.isSink && !node.isStream) {
|
return setSource(node);
|
||||||
Pipewire.preferredDefaultAudioSource = node;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -123,8 +152,7 @@ Singleton {
|
|||||||
const currentIndex = sinks.findIndex(s => s.name === currentName);
|
const currentIndex = sinks.findIndex(s => s.name === currentName);
|
||||||
const nextIndex = (currentIndex + 1) % sinks.length;
|
const nextIndex = (currentIndex + 1) % sinks.length;
|
||||||
const nextSink = sinks[nextIndex];
|
const nextSink = sinks[nextIndex];
|
||||||
if (!setDefaultSinkByName(nextSink.name))
|
setDefaultSinkByName(nextSink.name);
|
||||||
Pipewire.preferredDefaultAudioSink = nextSink;
|
|
||||||
const name = displayName(nextSink);
|
const name = displayName(nextSink);
|
||||||
audioOutputCycled(name, sinkIcon(nextSink));
|
audioOutputCycled(name, sinkIcon(nextSink));
|
||||||
return name;
|
return name;
|
||||||
@@ -1097,6 +1125,8 @@ EOFCONFIG
|
|||||||
}
|
}
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
|
rebuildTypedNodeLists();
|
||||||
|
|
||||||
if (soundsAvailable) {
|
if (soundsAvailable) {
|
||||||
checkGsettings();
|
checkGsettings();
|
||||||
Qt.callLater(createSoundPlayers);
|
Qt.callLater(createSoundPlayers);
|
||||||
|
|||||||
Reference in New Issue
Block a user