//@ pragma UseQApplication import QtQuick 2.15 import Quickshell import Quickshell.Io ShellRoot { id: niriState property var niriWindowsList: [] property var niriWorkspacesList: [] Process { running: true command: ["niri", "msg", "--json", "event-stream"] stdout: SplitParser { onRead: function(line) { try { var event = JSON.parse(line) var key = Object.keys(event)[0] var data = event[key] if (key === "WorkspacesChanged") { niriState.niriWorkspacesList = data.workspaces } else if (key === "WindowsChanged") { niriState.niriWindowsList = data.windows } else if (key === "WindowOpenedOrChanged") { var wins = niriState.niriWindowsList.slice() var idx = wins.findIndex(function(w) { return w.id === data.window.id }) if (idx >= 0) wins[idx] = data.window; else wins.push(data.window) niriState.niriWindowsList = wins } else if (key === "WindowClosed") { niriState.niriWindowsList = niriState.niriWindowsList.filter( function(w) { return w.id !== data.id }) } else if (key === "WindowFocusChanged") { niriState.niriWindowsList = niriState.niriWindowsList.map( function(w) { return Object.assign({}, w, {is_focused: w.id === data.id}) }) } else if (key === "WorkspaceActivated") { var activatedWs = niriState.niriWorkspacesList.find( function(ws) { return ws.id === data.id }) if (activatedWs) { var output = activatedWs.output niriState.niriWorkspacesList = niriState.niriWorkspacesList.map( function(ws) { if (ws.output !== output) return ws return Object.assign({}, ws, {is_active: ws.id === data.id}) }) } } else if (key === "WindowLayoutsChanged") { var wins = niriState.niriWindowsList.slice() data.changes.forEach(function(change) { var winId = change[0], layout = change[1] var i = wins.findIndex(function(w) { return w.id === winId }) if (i >= 0) wins[i] = Object.assign({}, wins[i], {layout: layout}) }) niriState.niriWindowsList = wins } } catch(e) {} } } } Variants { model: Quickshell.screens Bar { property var modelData screen: modelData niriWindowsList: niriState.niriWindowsList niriWorkspacesList: niriState.niriWorkspacesList } } }