Files
quickshell_bar/widgets/Workspaces.qml
T
asmir 9058dd7926 workspaces: auto-detect Hyprland alongside i3/Sway
Drive the switcher from Hyprland.workspaces when HYPRLAND_INSTANCE_SIGNATURE
is set, else fall back to I3.workspaces. The ?: model binding only evaluates
the taken branch, so the unused backend singleton is never instantiated (no
stray IPC). Both workspace types share the same shape (name/active/focused/
urgent/monitor.name/activate()), so the chip renderer is unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 16:16:55 +02:00

64 lines
2.4 KiB
QML

import QtQuick
import QtQuick.Layouts
import Quickshell
import Quickshell.I3
import Quickshell.Hyprland
import "../config"
// Workspace switcher for a single monitor. Works on both Sway/i3 and Hyprland:
// the compositor is detected once from its instance env var, and the matching
// Quickshell backend model is used. The two backends expose the same item shape
// (name / active / focused / urgent / monitor.name / activate()), so a single
// chip renderer covers both. The `?:` on `model` only evaluates the taken
// branch, so the unused backend singleton is never instantiated (no stray IPC).
Row {
id: root
required property var screen // ShellScreen this bar lives on
spacing: Theme.gap
// Which compositor are we under? Hyprland always exports this signature.
readonly property bool isHyprland: !!Quickshell.env("HYPRLAND_INSTANCE_SIGNATURE")
// Name of the output this bar is on, used to filter workspaces.
readonly property string monitorName: screen ? screen.name : ""
Repeater {
model: root.isHyprland ? Hyprland.workspaces : I3.workspaces
Rectangle {
id: chip
required property var modelData
// only show workspaces belonging to this monitor. Both I3Workspace
// and HyprlandWorkspace expose .monitor as an object with a .name.
visible: modelData.monitor && modelData.monitor.name === root.monitorName
width: visible ? Math.max(height, label.implicitWidth + 16) : 0
height: Theme.barHeight - Theme.gap * 2
radius: Theme.radius
readonly property bool isFocused: modelData.focused
readonly property bool isUrgent: modelData.urgent
color: isUrgent ? Theme.red
: isFocused ? Theme.blue
: modelData.active ? Theme.surface1
: Theme.surface0
Text {
id: label
anchors.centerIn: parent
text: chip.modelData.name
font.family: Theme.font
font.pixelSize: Theme.fontSize
font.bold: chip.isFocused || chip.isUrgent
color: (chip.isFocused || chip.isUrgent) ? Theme.mantle : Theme.text
}
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: chip.modelData.activate()
}
}
}
}