mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-08-06 05:28:29 -04:00
2baf048293
* feat(tray): add IPC action to open tray menus * tray: open IPC-requested menus on the focused screen only --------- Co-authored-by: bbedward <bbedward@gmail.com>
88 lines
2.5 KiB
QML
88 lines
2.5 KiB
QML
pragma Singleton
|
|
|
|
import Quickshell
|
|
import Quickshell.Services.SystemTray
|
|
import QtQuick
|
|
|
|
Singleton {
|
|
id: root
|
|
|
|
property var activeTrayMenus: ({})
|
|
property var _pendingMenuRequest: null
|
|
|
|
signal openTrayMenuRequested
|
|
|
|
function requestOpenMenu(itemId, screenName) {
|
|
_pendingMenuRequest = {
|
|
"itemId": itemId,
|
|
"screenName": screenName
|
|
};
|
|
openTrayMenuRequested();
|
|
}
|
|
|
|
// Every SystemTrayBar instance receives the signal; the claim ensures
|
|
// exactly one opens the menu, preferring the requested screen
|
|
function claimMenuRequest(instanceScreenName) {
|
|
if (!_pendingMenuRequest)
|
|
return null;
|
|
if (_pendingMenuRequest.screenName && _pendingMenuRequest.screenName !== instanceScreenName)
|
|
return null;
|
|
const request = _pendingMenuRequest;
|
|
_pendingMenuRequest = null;
|
|
return request;
|
|
}
|
|
|
|
function findTrayItem(itemId: string): var {
|
|
if (!itemId)
|
|
return null;
|
|
|
|
return SystemTray.items.values.find(item => {
|
|
const id = item?.id || "";
|
|
const title = item?.tooltipTitle || "";
|
|
const fullKey = title ? `${id}::${title}` : id;
|
|
return fullKey === itemId || id === itemId;
|
|
});
|
|
}
|
|
|
|
function registerMenu(screenName, menu) {
|
|
if (!screenName || !menu)
|
|
return;
|
|
const newMenus = Object.assign({}, activeTrayMenus);
|
|
newMenus[screenName] = menu;
|
|
activeTrayMenus = newMenus;
|
|
}
|
|
|
|
function unregisterMenu(screenName) {
|
|
if (!screenName)
|
|
return;
|
|
const newMenus = Object.assign({}, activeTrayMenus);
|
|
delete newMenus[screenName];
|
|
activeTrayMenus = newMenus;
|
|
}
|
|
|
|
function closeHoverMenus() {
|
|
for (const screenName in activeTrayMenus) {
|
|
const menu = activeTrayMenus[screenName]
|
|
if (!menu || menu.openedByHover !== true) continue
|
|
if (typeof menu.close === "function") {
|
|
menu.close()
|
|
} else if (menu.showMenu !== undefined) {
|
|
menu.showMenu = false
|
|
}
|
|
}
|
|
}
|
|
|
|
function closeAllMenus() {
|
|
for (const screenName in activeTrayMenus) {
|
|
const menu = activeTrayMenus[screenName];
|
|
if (!menu)
|
|
continue;
|
|
if (typeof menu.close === "function") {
|
|
menu.close();
|
|
} else if (menu.showMenu !== undefined) {
|
|
menu.showMenu = false;
|
|
}
|
|
}
|
|
}
|
|
}
|