1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2025-12-06 05:25:41 -05:00

hyprland for running apps workspace only

This commit is contained in:
bbedward
2025-08-26 15:29:35 -04:00
parent 50ea9daca6
commit e2df1da5be
3 changed files with 102 additions and 57 deletions

View File

@@ -272,7 +272,7 @@ Item {
DankToggle {
width: parent.width
text: "Running Apps Only In Current Workspace"
description: "Show only apps running in current workspace (currently niri only)"
description: "Show only apps running in current workspace"
checked: SettingsData.runningAppsCurrentWorkspace
onToggled: checked => {
return SettingsData.setRunningAppsCurrentWorkspace(

View File

@@ -70,13 +70,49 @@ Singleton {
detectCompositor()
}
// return only the toplevels on the current workspace on the given screen
function filterCurrentWorkspace(toplevels, screen){
if (useNiriSorting) {
return NiriService.filterCurrentWorkspace(toplevels, screen)
}
//fallback to returning everything
return toplevels
if (useNiriSorting) {
return NiriService.filterCurrentWorkspace(toplevels, screen)
}
if (isHyprland) {
return filterHyprlandCurrentWorkspace(toplevels, screen)
}
return toplevels
}
function filterHyprlandCurrentWorkspace(toplevels, screenName) {
if (!toplevels || toplevels.length === 0 || !Hyprland.toplevels) {
return toplevels
}
var currentWorkspaceId = null
const hyprlandToplevels = Array.from(Hyprland.toplevels.values)
for (var i = 0; i < hyprlandToplevels.length; i++) {
var hyprToplevel = hyprlandToplevels[i]
if (hyprToplevel.activated && hyprToplevel.monitor && hyprToplevel.monitor.name === screenName) {
currentWorkspaceId = hyprToplevel.workspace ? hyprToplevel.workspace.id : null
break
}
}
if (currentWorkspaceId === null && Hyprland.focusedWorkspace) {
currentWorkspaceId = Hyprland.focusedWorkspace.id
}
if (currentWorkspaceId === null) {
return toplevels
}
return toplevels.filter(toplevel => {
for (var j = 0; j < hyprlandToplevels.length; j++) {
var hyprToplevel = hyprlandToplevels[j]
if (hyprToplevel.wayland === toplevel) {
return hyprToplevel.workspace && hyprToplevel.workspace.id === currentWorkspaceId
}
}
return false
})
}
function detectCompositor() {

View File

@@ -33,6 +33,10 @@ Singleton {
readonly property string socketPath: Quickshell.env("NIRI_SOCKET")
Component.onCompleted: {
fetchOutputs()
}
function fetchOutputs() {
if (CompositorService.isNiri) {
outputsProcess.running = true
@@ -451,82 +455,87 @@ Singleton {
function getToplevelToNiriMap(toplevels){
// Create a map to match toplevels to niri windows
// We'll match by appId and title since toplevels don't have numeric IDs
var toplevelToNiriMap = {}
function findNiriWindow(toplevel) {
if (!toplevel.appId) return null
for (var i = 0; i < toplevels.length; i++) {
var toplevel = toplevels[i]
if (!toplevel.appId) continue
// Find matching niri window by appId and optionally title
for (var j = 0; j < windows.length; j++) {
var niriWindow = windows[j]
// Match by appId
if (niriWindow.app_id === toplevel.appId) {
// If title also matches or niri window has no title, use this match
if (!niriWindow.title || niriWindow.title === toplevel.title) {
toplevelToNiriMap[i] = {
niriIndex: j,
niriWindow: niriWindow
}
break
}
// If we found appId match but no title match yet, store as fallback
if (!(i in toplevelToNiriMap)) {
toplevelToNiriMap[i] = {
niriIndex: j,
niriWindow: niriWindow
}
}
for (var j = 0; j < windows.length; j++) {
var niriWindow = windows[j]
if (niriWindow.app_id === toplevel.appId) {
if (!niriWindow.title || niriWindow.title === toplevel.title) {
return { niriIndex: j, niriWindow: niriWindow }
}
}
}
return toplevelToNiriMap
return null
}
function sortToplevels(toplevels) {
if (!toplevels || toplevels.length === 0 || !CompositorService.isNiri || windows.length === 0) {
return [...toplevels]
}
const toplevelToNiriMap = getToplevelToNiriMap(toplevels)
// Sort toplevels using niri's ordering
return [...toplevels].sort((a, b) => {
var aIndex = toplevels.indexOf(a)
var bIndex = toplevels.indexOf(b)
var aNiri = findNiriWindow(a)
var bNiri = findNiriWindow(b)
var aNiri = toplevelToNiriMap[aIndex]
var bNiri = toplevelToNiriMap[bIndex]
if (!aNiri && !bNiri) return 0
if (!aNiri) return 1
if (!bNiri) return -1
// If both have niri data, use niri ordering
if (aNiri && bNiri) {
return aNiri.niriIndex - bNiri.niriIndex
var aWindow = aNiri.niriWindow
var bWindow = bNiri.niriWindow
var aWorkspace = allWorkspaces.find(ws => ws.id === aWindow.workspace_id)
var bWorkspace = allWorkspaces.find(ws => ws.id === bWindow.workspace_id)
if (aWorkspace && bWorkspace) {
if (aWorkspace.output !== bWorkspace.output) {
return aWorkspace.output.localeCompare(bWorkspace.output)
}
if (aWorkspace.output === bWorkspace.output && aWorkspace.idx !== bWorkspace.idx) {
return aWorkspace.idx - bWorkspace.idx
}
}
// If only one has niri data, prioritize it
if (aNiri && !bNiri) return -1
if (!aNiri && bNiri) return 1
if (aWindow.workspace_id === bWindow.workspace_id &&
aWindow.layout && bWindow.layout &&
aWindow.layout.pos_in_scrolling_layout &&
bWindow.layout.pos_in_scrolling_layout) {
var aPos = aWindow.layout.pos_in_scrolling_layout
var bPos = bWindow.layout.pos_in_scrolling_layout
if (aPos.length > 1 && bPos.length > 1) {
if (aPos[0] !== bPos[0]) {
return aPos[0] - bPos[0]
}
if (aPos[1] !== bPos[1]) {
return aPos[1] - bPos[1]
}
}
}
// If neither has niri data, keep original toplevel order
return 0
return aWindow.id - bWindow.id
})
}
function filterCurrentWorkspace(toplevels, screenName){
const toplevelToNiriMap = getToplevelToNiriMap(toplevels)
var currentWorkspaceId = null
for (var i = 0; i < NiriService.allWorkspaces.length; i++) {
var ws = NiriService.allWorkspaces[i]
for (var i = 0; i < allWorkspaces.length; i++) {
var ws = allWorkspaces[i]
if (ws.output === screenName && ws.is_active){
currentWorkspaceId = ws.id
break
}
}
return toplevels.filter((t, idx) => toplevelToNiriMap[idx] && toplevelToNiriMap[idx].niriWindow.workspace_id == currentWorkspaceId)
if (currentWorkspaceId === null) {
return toplevels
}
return toplevels.filter(toplevel => {
var niriMatch = findNiriWindow(toplevel)
return niriMatch && niriMatch.niriWindow.workspace_id === currentWorkspaceId
})
}
}