Bar-widget panels (audio, bluetooth, network, power, monitor) used to be toggled via their own per-plugin IpcHandler targets. Quickshell resolves duplicate targets first-handler-wins, so after a plugin or bar reload the stale handler of the destroyed widget instance kept claiming the target and the hotkeys went dead. The shell root's IpcHandler lives outside the reload cycle, so summon, hide, and toggle now go through `omarchy-shell shell toggle <plugin>` and the shell routes to the live widget instance via the bar's slot registry. Panel plugins that are also panel/overlay/menu kinds keep using the panel loader path. Failures to find a live widget are logged so a widget missing from the bar layout stays diagnosable. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
55 lines
1.6 KiB
QML
55 lines
1.6 KiB
QML
import QtQuick
|
|
import Quickshell
|
|
import Quickshell.Services.Pipewire
|
|
import qs.Ui
|
|
|
|
BarWidget {
|
|
id: root
|
|
moduleName: "omarchy.microphone"
|
|
|
|
|
|
readonly property var source: Pipewire.defaultAudioSource
|
|
readonly property bool muted: source && source.audio ? source.audio.muted : true
|
|
readonly property real volume: source && source.audio ? source.audio.volume : 0
|
|
readonly property var nodes: Pipewire.nodes ? Pipewire.nodes.values : []
|
|
|
|
readonly property var activeStreams: {
|
|
var list = []
|
|
for (var i = 0; i < nodes.length; i++) {
|
|
var node = nodes[i]
|
|
if (node && node.isStream && node.isSink === false && !node.audio?.muted) list.push(node)
|
|
}
|
|
return list
|
|
}
|
|
|
|
readonly property bool inUse: activeStreams.length > 0 && !muted
|
|
|
|
visible: source !== null
|
|
implicitWidth: button.implicitWidth
|
|
implicitHeight: button.implicitHeight
|
|
|
|
function toggleMute() {
|
|
if (source && source.audio) source.audio.muted = !source.audio.muted
|
|
}
|
|
|
|
PwObjectTracker { objects: root.source ? [root.source] : [] }
|
|
|
|
WidgetButton {
|
|
id: button
|
|
anchors.fill: parent
|
|
bar: root.bar
|
|
text: root.muted ? "" : ""
|
|
active: root.inUse
|
|
tooltipText: root.muted ? "Microphone muted" : (root.inUse ? "Microphone in use" : "Microphone live")
|
|
onPressed: function(b) {
|
|
if (b === Qt.MiddleButton) root.bar.run("omarchy-shell shell toggle omarchy.audio")
|
|
else root.toggleMute()
|
|
}
|
|
onWheelMoved: function(delta) {
|
|
if (!root.source || !root.source.audio) return
|
|
var step = 0.05
|
|
root.source.audio.volume = Math.max(0, Math.min(1, root.volume + (delta > 0 ? step : -step)))
|
|
}
|
|
}
|
|
}
|