update workspace plugin to work with named workspaces

This commit is contained in:
jfmonty2 committed 2026-10-02 10:03:04 -04:00
1 parent cdbd3e7308
commit c5926b669c
1 file changed
+26 -8
@@ -45,24 +45,37 @@ BarWidget {
return null return null
} }
// Hyprland gives named workspaces negative ids, as it does special
// (scratchpad) workspaces; only the latter have a "special:" name.
function isNamed(ws) {
return ws !== null && ws.id < 0 && String(ws.name).indexOf("special") !== 0
}
// Numbered workspaces 1-10 in order, then named ones alphabetically.
function workspaceIds() { function workspaceIds() {
var ids = [] var numbered = []
var named = []
var values = Hyprland.workspaces.values var values = Hyprland.workspaces.values
for (var i = 0; i < values.length; i++) { for (var i = 0; i < values.length; i++) {
var ws = values[i] var ws = values[i]
if (ws.id <= 0 || ws.id > 10) continue
if (root.monitor && ws.monitor !== root.monitor) continue if (root.monitor && ws.monitor !== root.monitor) continue
ids.push(ws.id) if (ws.id > 0 && ws.id <= 10) numbered.push(ws.id)
else if (root.isNamed(ws)) named.push(ws)
} }
ids.sort(function(left, right) { return left - right }) numbered.sort(function(left, right) { return left - right })
return ids named.sort(function(left, right) { return String(left.name).localeCompare(String(right.name)) })
return numbered.concat(named.map(function(ws) { return ws.id }))
} }
function focusWorkspace(id) { function focusWorkspace(id) {
if (!root.bar) return if (!root.bar) return
root.bar.run("hyprctl dispatch " + Util.shellQuote("hl.dsp.focus({ workspace = \"" + id + "\" })")) var ws = root.workspaceById(id)
var target = root.isNamed(ws)
? "name:" + String(ws.name).replace(/\\/g, "\\\\").replace(/"/g, "\\\"")
: String(id)
root.bar.run("hyprctl dispatch " + Util.shellQuote("hl.dsp.focus({ workspace = \"" + target + "\" })"))
} }
readonly property real trailingGap: root.vertical ? 0 : Style.spaceReal(1.5) readonly property real trailingGap: root.vertical ? 0 : Style.spaceReal(1.5)
@@ -92,17 +105,22 @@ BarWidget {
id: button id: button
bar: root.bar bar: root.bar
text: modelData === 10 ? "0" : String(modelData) readonly property bool named: root.isNamed(workspace)
text: named ? String(workspace.name) : (modelData === 10 ? "0" : String(modelData))
// WidgetButton's own label can't be bolded, so draw our own instead. // WidgetButton's own label can't be bolded, so draw our own instead.
labelVisible: false labelVisible: false
opacity: occupied || focused ? 1 : 0.5 opacity: occupied || focused ? 1 : 0.5
horizontalMargin: 6 horizontalMargin: 6
verticalPadding: 6 verticalPadding: 6
fixedWidth: root.vertical ? root.barSize : Style.space(20) // Numbers get a fixed slot; names get as much room as they need.
fixedWidth: root.vertical ? root.barSize
: (named ? Math.max(Style.space(20), label.implicitWidth + Style.space(12)) : Style.space(20))
fixedHeight: root.barSize fixedHeight: root.barSize
onPressed: function() { root.focusWorkspace(modelData) } onPressed: function() { root.focusWorkspace(modelData) }
Text { Text {
id: label
anchors.centerIn: parent anchors.centerIn: parent
textFormat: Text.PlainText textFormat: Text.PlainText
text: button.text text: button.text