mirror of
https://github.com/end-4/dots-hyprland.git
synced 2026-06-05 14:59:27 -05:00
134 lines
3.6 KiB
QML
134 lines
3.6 KiB
QML
pragma Singleton
|
|
pragma ComponentBehavior: Bound
|
|
|
|
import QtQuick
|
|
import Quickshell
|
|
import Quickshell.Io
|
|
import Quickshell.Hyprland
|
|
|
|
/**
|
|
* Provides access to some Hyprland data not available in Quickshell.Hyprland.
|
|
*/
|
|
Singleton {
|
|
id: root
|
|
property var windowList: []
|
|
property var addresses: []
|
|
property var windowByAddress: ({})
|
|
property var workspaces: []
|
|
property var workspaceIds: []
|
|
property var workspaceById: ({})
|
|
property var activeWorkspace: null
|
|
property var monitors: []
|
|
property var layers: ({})
|
|
|
|
function updateWindowList() {
|
|
getClients.running = true;
|
|
}
|
|
|
|
function updateLayers() {
|
|
getLayers.running = true;
|
|
}
|
|
|
|
function updateMonitors() {
|
|
getMonitors.running = true;
|
|
}
|
|
|
|
function updateWorkspaces() {
|
|
getWorkspaces.running = true;
|
|
getActiveWorkspace.running = true;
|
|
}
|
|
|
|
function updateAll() {
|
|
updateWindowList();
|
|
updateMonitors();
|
|
updateLayers();
|
|
updateWorkspaces();
|
|
}
|
|
|
|
function biggestWindowForWorkspace(workspaceId) {
|
|
const windowsInThisWorkspace = HyprlandData.windowList.filter(w => w.workspace.id == workspaceId);
|
|
return windowsInThisWorkspace.reduce((maxWin, win) => {
|
|
const maxArea = (maxWin?.size?.[0] ?? 0) * (maxWin?.size?.[1] ?? 0);
|
|
const winArea = (win?.size?.[0] ?? 0) * (win?.size?.[1] ?? 0);
|
|
return winArea > maxArea ? win : maxWin;
|
|
}, null);
|
|
}
|
|
|
|
Component.onCompleted: {
|
|
updateAll();
|
|
}
|
|
|
|
Connections {
|
|
target: Hyprland
|
|
|
|
function onRawEvent(event) {
|
|
// console.log("Hyprland raw event:", event.name);
|
|
updateAll()
|
|
}
|
|
}
|
|
|
|
Process {
|
|
id: getClients
|
|
command: ["bash", "-c", "hyprctl clients -j | jq -c"]
|
|
stdout: SplitParser {
|
|
onRead: data => {
|
|
root.windowList = JSON.parse(data);
|
|
let tempWinByAddress = {};
|
|
for (var i = 0; i < root.windowList.length; ++i) {
|
|
var win = root.windowList[i];
|
|
tempWinByAddress[win.address] = win;
|
|
}
|
|
root.windowByAddress = tempWinByAddress;
|
|
root.addresses = root.windowList.map(win => win.address);
|
|
}
|
|
}
|
|
}
|
|
|
|
Process {
|
|
id: getMonitors
|
|
command: ["bash", "-c", "hyprctl monitors -j | jq -c"]
|
|
stdout: SplitParser {
|
|
onRead: data => {
|
|
root.monitors = JSON.parse(data);
|
|
}
|
|
}
|
|
}
|
|
|
|
Process {
|
|
id: getLayers
|
|
command: ["bash", "-c", "hyprctl layers -j | jq -c"]
|
|
stdout: SplitParser {
|
|
onRead: data => {
|
|
root.layers = JSON.parse(data);
|
|
}
|
|
}
|
|
}
|
|
|
|
Process {
|
|
id: getWorkspaces
|
|
command: ["bash", "-c", "hyprctl workspaces -j | jq -c"]
|
|
stdout: SplitParser {
|
|
onRead: data => {
|
|
root.workspaces = JSON.parse(data);
|
|
let tempWorkspaceById = {};
|
|
for (var i = 0; i < root.workspaces.length; ++i) {
|
|
var ws = root.workspaces[i];
|
|
tempWorkspaceById[ws.id] = ws;
|
|
}
|
|
root.workspaceById = tempWorkspaceById;
|
|
root.workspaceIds = root.workspaces.map(ws => ws.id);
|
|
}
|
|
}
|
|
}
|
|
|
|
Process {
|
|
id: getActiveWorkspace
|
|
command: ["bash", "-c", "hyprctl activeworkspace -j | jq -c"]
|
|
stdout: SplitParser {
|
|
onRead: data => {
|
|
root.activeWorkspace = JSON.parse(data);
|
|
}
|
|
}
|
|
}
|
|
}
|