mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2025-12-09 23:15:38 -05:00
focusedwindow: fix various issues with workspaces
This commit is contained in:
@@ -14,17 +14,33 @@ Singleton {
|
|||||||
property string focusedWindowTitle: ""
|
property string focusedWindowTitle: ""
|
||||||
property int focusedWindowId: -1
|
property int focusedWindowId: -1
|
||||||
|
|
||||||
|
|
||||||
|
function updateFromNiriData() {
|
||||||
|
if (!root.niriAvailable) {
|
||||||
|
clearFocusedWindow();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const focusedWindowId = NiriWorkspaceService.focusedWindowId;
|
||||||
|
if (!focusedWindowId) {
|
||||||
|
clearFocusedWindow();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const focusedWindow = NiriWorkspaceService.windows.find(w => w.id === focusedWindowId);
|
||||||
|
if (focusedWindow) {
|
||||||
|
root.focusedAppId = focusedWindow.app_id || "";
|
||||||
|
root.focusedWindowTitle = focusedWindow.title || "";
|
||||||
|
root.focusedAppName = getDisplayName(focusedWindow.app_id || "");
|
||||||
|
root.focusedWindowId = parseInt(focusedWindow.id) || -1;
|
||||||
|
} else {
|
||||||
|
clearFocusedWindow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function loadInitialFocusedWindow() {
|
function loadInitialFocusedWindow() {
|
||||||
if (root.niriAvailable)
|
if (root.niriAvailable)
|
||||||
focusedWindowQuery.running = true;
|
focusedWindowQuery.running = true;
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateFocusedWindowData() {
|
|
||||||
if (root.niriAvailable && root.focusedWindowId !== -1)
|
|
||||||
focusedWindowQuery.running = true;
|
|
||||||
else
|
|
||||||
clearFocusedWindow();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function clearFocusedWindow() {
|
function clearFocusedWindow() {
|
||||||
@@ -38,7 +54,6 @@ Singleton {
|
|||||||
if (!appId)
|
if (!appId)
|
||||||
return "";
|
return "";
|
||||||
|
|
||||||
// Common app_id to display name mappings
|
|
||||||
const appNames = {
|
const appNames = {
|
||||||
"com.mitchellh.ghostty": "Ghostty",
|
"com.mitchellh.ghostty": "Ghostty",
|
||||||
"org.mozilla.firefox": "Firefox",
|
"org.mozilla.firefox": "Firefox",
|
||||||
@@ -59,12 +74,10 @@ Singleton {
|
|||||||
"slack": "Slack",
|
"slack": "Slack",
|
||||||
"zoom": "Zoom"
|
"zoom": "Zoom"
|
||||||
};
|
};
|
||||||
// Return mapped name or clean up the app_id
|
|
||||||
if (appNames[appId])
|
if (appNames[appId])
|
||||||
return appNames[appId];
|
return appNames[appId];
|
||||||
|
|
||||||
// Try to extract a clean name from the app_id
|
|
||||||
// Remove common prefixes and make first letter uppercase
|
|
||||||
let cleanName = appId.replace(/^(org\.|com\.|net\.|io\.)/, '').replace(/\./g, ' ').split(' ').map((word) => {
|
let cleanName = appId.replace(/^(org\.|com\.|net\.|io\.)/, '').replace(/\./g, ' ').split(' ').map((word) => {
|
||||||
return word.charAt(0).toUpperCase() + word.slice(1);
|
return word.charAt(0).toUpperCase() + word.slice(1);
|
||||||
}).join(' ');
|
}).join(' ');
|
||||||
@@ -72,9 +85,7 @@ Singleton {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
// Use the availability from NiriWorkspaceService to avoid duplicate checks
|
|
||||||
root.niriAvailable = NiriWorkspaceService.niriAvailable;
|
root.niriAvailable = NiriWorkspaceService.niriAvailable;
|
||||||
// Connect to workspace service events
|
|
||||||
NiriWorkspaceService.onNiriAvailableChanged.connect(() => {
|
NiriWorkspaceService.onNiriAvailableChanged.connect(() => {
|
||||||
root.niriAvailable = NiriWorkspaceService.niriAvailable;
|
root.niriAvailable = NiriWorkspaceService.niriAvailable;
|
||||||
if (root.niriAvailable)
|
if (root.niriAvailable)
|
||||||
@@ -86,21 +97,32 @@ Singleton {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Listen to window focus changes from NiriWorkspaceService
|
|
||||||
Connections {
|
Connections {
|
||||||
function onFocusedWindowIdChanged() {
|
function onFocusedWindowIdChanged() {
|
||||||
root.focusedWindowId = parseInt(NiriWorkspaceService.focusedWindowId) || -1;
|
root.focusedWindowId = parseInt(NiriWorkspaceService.focusedWindowId) || -1;
|
||||||
updateFocusedWindowData();
|
updateFromNiriData();
|
||||||
}
|
}
|
||||||
|
|
||||||
function onFocusedWindowTitleChanged() {
|
function onFocusedWindowTitleChanged() {
|
||||||
root.focusedWindowTitle = NiriWorkspaceService.focusedWindowTitle;
|
root.focusedWindowTitle = NiriWorkspaceService.focusedWindowTitle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function onWindowsChanged() {
|
||||||
|
updateFromNiriData();
|
||||||
|
}
|
||||||
|
|
||||||
|
function onWindowOpenedOrChanged(windowData) {
|
||||||
|
if (windowData.is_focused) {
|
||||||
|
root.focusedAppId = windowData.app_id || "";
|
||||||
|
root.focusedWindowTitle = windowData.title || "";
|
||||||
|
root.focusedAppName = getDisplayName(windowData.app_id || "");
|
||||||
|
root.focusedWindowId = parseInt(windowData.id) || -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
target: NiriWorkspaceService
|
target: NiriWorkspaceService
|
||||||
}
|
}
|
||||||
|
|
||||||
// Process to get focused window info
|
|
||||||
Process {
|
Process {
|
||||||
id: focusedWindowQuery
|
id: focusedWindowQuery
|
||||||
|
|
||||||
@@ -125,7 +147,7 @@ Singleton {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ Singleton {
|
|||||||
// Overview state
|
// Overview state
|
||||||
property bool inOverview: false
|
property bool inOverview: false
|
||||||
|
|
||||||
|
signal windowOpenedOrChanged(var windowData)
|
||||||
|
|
||||||
// Feature availability
|
// Feature availability
|
||||||
property bool niriAvailable: false
|
property bool niriAvailable: false
|
||||||
|
|
||||||
@@ -75,9 +77,57 @@ Singleton {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Load initial windows data
|
||||||
|
Process {
|
||||||
|
id: initialWindowsQuery
|
||||||
|
command: ["niri", "msg", "-j", "windows"]
|
||||||
|
running: false
|
||||||
|
|
||||||
|
stdout: StdioCollector {
|
||||||
|
onStreamFinished: {
|
||||||
|
if (text && text.trim()) {
|
||||||
|
try {
|
||||||
|
const windowsData = JSON.parse(text.trim())
|
||||||
|
if (windowsData && windowsData.windows) {
|
||||||
|
handleWindowsChanged(windowsData)
|
||||||
|
console.log("NiriWorkspaceService: Loaded", windowsData.windows.length, "initial windows")
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.warn("NiriWorkspaceService: Failed to parse initial windows data:", e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load initial focused window data
|
||||||
|
Process {
|
||||||
|
id: initialFocusedWindowQuery
|
||||||
|
command: ["niri", "msg", "-j", "focused-window"]
|
||||||
|
running: false
|
||||||
|
|
||||||
|
stdout: StdioCollector {
|
||||||
|
onStreamFinished: {
|
||||||
|
if (text && text.trim()) {
|
||||||
|
try {
|
||||||
|
const focusedData = JSON.parse(text.trim())
|
||||||
|
if (focusedData && focusedData.id) {
|
||||||
|
handleWindowFocusChanged({ id: focusedData.id })
|
||||||
|
console.log("NiriWorkspaceService: Loaded initial focused window:", focusedData.id)
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.warn("NiriWorkspaceService: Failed to parse initial focused window data:", e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function loadInitialWorkspaceData() {
|
function loadInitialWorkspaceData() {
|
||||||
console.log("NiriWorkspaceService: Loading initial workspace data...")
|
console.log("NiriWorkspaceService: Loading initial workspace data...")
|
||||||
initialDataQuery.running = true
|
initialDataQuery.running = true
|
||||||
|
initialWindowsQuery.running = true
|
||||||
|
initialFocusedWindowQuery.running = true
|
||||||
}
|
}
|
||||||
|
|
||||||
// Event stream for real-time updates
|
// Event stream for real-time updates
|
||||||
@@ -117,6 +167,8 @@ Singleton {
|
|||||||
handleWindowClosed(event.WindowClosed)
|
handleWindowClosed(event.WindowClosed)
|
||||||
} else if (event.WindowFocusChanged) {
|
} else if (event.WindowFocusChanged) {
|
||||||
handleWindowFocusChanged(event.WindowFocusChanged)
|
handleWindowFocusChanged(event.WindowFocusChanged)
|
||||||
|
} else if (event.WindowOpenedOrChanged) {
|
||||||
|
handleWindowOpenedOrChanged(event.WindowOpenedOrChanged)
|
||||||
} else if (event.OverviewOpenedOrClosed) {
|
} else if (event.OverviewOpenedOrClosed) {
|
||||||
handleOverviewChanged(event.OverviewOpenedOrClosed)
|
handleOverviewChanged(event.OverviewOpenedOrClosed)
|
||||||
}
|
}
|
||||||
@@ -192,6 +244,34 @@ Singleton {
|
|||||||
updateFocusedWindow()
|
updateFocusedWindow()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function handleWindowOpenedOrChanged(data) {
|
||||||
|
if (!data.window) return;
|
||||||
|
|
||||||
|
const window = data.window;
|
||||||
|
const existingIndex = windows.findIndex(w => w.id === window.id);
|
||||||
|
|
||||||
|
if (existingIndex >= 0) {
|
||||||
|
// Update existing window - create new array to trigger property change
|
||||||
|
let updatedWindows = [...windows];
|
||||||
|
updatedWindows[existingIndex] = window;
|
||||||
|
windows = updatedWindows.sort((a, b) => a.id - b.id);
|
||||||
|
} else {
|
||||||
|
// Add new window
|
||||||
|
windows = [...windows, window].sort((a, b) => a.id - b.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update focused window if this window is focused
|
||||||
|
if (window.is_focused) {
|
||||||
|
focusedWindowId = window.id;
|
||||||
|
focusedWindowIndex = windows.findIndex(w => w.id === window.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateFocusedWindow();
|
||||||
|
|
||||||
|
// Emit signal for other services to listen to
|
||||||
|
windowOpenedOrChanged(window);
|
||||||
|
}
|
||||||
|
|
||||||
function handleOverviewChanged(data) {
|
function handleOverviewChanged(data) {
|
||||||
inOverview = data.is_open
|
inOverview = data.is_open
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user