Files
gpu-screen-recorder-ui/tools/gsr-kwin-helper/gsrkwinhelper.js
2026-03-24 12:38:32 +01:00

87 lines
2.8 KiB
JavaScript

const DAEMON_DBUS_NAME = "com.dec05eba.gpu_screen_recorder";
function dbusSendUpdateActiveWindow(title, isFullscreen, monitorName) {
callDBus(
DAEMON_DBUS_NAME, "/", DAEMON_DBUS_NAME,
"updateActiveWindow",
title, isFullscreen, monitorName,
);
}
let prevWindow = null;
let prevEmitActiveWindowUpdate = null;
let prevCaption = null;
let prevFullScreen = null;
let prevMonitorName = null;
function dbusSafeDisconnect(window, signalName, callback) {
try {
const signal = window?.[signalName];
if (signal && callback) {
signal.disconnect(callback);
}
} catch (e) {
// ignore stale/missing signal disconnects
}
}
function dbusSafeConnect(window, signalName, callback) {
try {
const signal = window?.[signalName];
if (signal && callback) {
signal.connect(callback);
}
} catch (e) {
// ignore missing signals
}
}
function emitActiveWindowUpdate(window) {
if (workspace.activeWindow === window) {
let caption = window.caption || "";
let fullScreen = window.fullScreen || false;
let monitorName = window.output?.name || "";
if (caption !== prevCaption || fullScreen !== prevFullScreen || monitorName !== prevMonitorName) {
dbusSendUpdateActiveWindow(caption, fullScreen, monitorName);
prevCaption = caption;
prevFullScreen = fullScreen;
prevMonitorName = monitorName;
}
}
}
function subscribeToWindow(window) {
if (!window) return;
if (prevWindow !== window) {
if (prevWindow !== null) {
dbusSafeDisconnect(prevWindow, "captionChanged", prevEmitActiveWindowUpdate);
dbusSafeDisconnect(prevWindow, "fullScreenChanged", prevEmitActiveWindowUpdate);
dbusSafeDisconnect(prevWindow, "outputChanged", prevEmitActiveWindowUpdate);
}
let emitActiveWindowUpdateBound = emitActiveWindowUpdate.bind(null, window);
dbusSafeConnect(window, "captionChanged", emitActiveWindowUpdateBound);
dbusSafeConnect(window, "fullScreenChanged", emitActiveWindowUpdateBound);
dbusSafeConnect(window, "outputChanged", emitActiveWindowUpdateBound);
prevWindow = window;
prevEmitActiveWindowUpdate = emitActiveWindowUpdateBound;
}
}
function updateActiveWindow(window) {
if (!window) return;
if (!window.normalWindow) return;
if (window.resourceName === "gsr-ui" || window.resourceName === "gsr-notify") return; // ignore the overlay and notification
if (window.resourceClass === "org.kde.spectacle") return;
emitActiveWindowUpdate(window);
subscribeToWindow(window);
}
// handle window focus changes
workspace.windowActivated.connect(updateActiveWindow);
// handle initial state
if (workspace.activeWindow) {
updateActiveWindow(workspace.activeWindow);
}