如何通过名称获取 Clutter.Actor

How to get Clutter.Actor via its name

我正在使用 GJS,如何通过其名称获取 Clutter.Actor。例如,如果我想获得 GNOME Shell 的顶部面板,我如何通过它的名称 "panel" 获得它的 Clutter.Actor?

我的研究在 Clutter.Stage 的某个地方结束了,这是可以附加 Actor 的地方,但是按照我的看法,可以设置多个阶段,所以我可能还必须找到我要查找的演员处于哪个阶段。现在我想知道如何通过名字获得演员。

我从代码中看到了; Main.layoutManager.panelBox 获取 GNOME Shell 的顶部面板,但这似乎不适用于我的情况,因为它是我试图获取的第三方 Actor,以及我希望获取 Actor( s) 是通过名称,因为我可能正在与不同的第三方演员合作。

我知道有一种方法可以得到它; Main.layoutManager.panelBox.get_parent().get_children() 我可以通过它的索引获取特定的 Actor,但我认为这不是解决这个问题的最佳方式,考虑到事物的动态性,其次,我发现这种方式有点草率所以..

我可以通过 Looking Glass (Alt + F2 -> lg -> picker) 获取名称。目前,我尝试获取的特定 Actor 是 DashtoDock 的,仅供参考。

谢谢~希望有人能帮忙

不幸的是,您正在寻找的似乎是一个 searchByName() 函数,但我认为您必须自己实现它。像(未经测试):

function searchByName(topActor, name) {
    let children = topActor.get_children();

    for (let i = 0; i < children.length; i++) {
        if (child.name === name) {
            return child;
        } else if (child.get_n_children()) {
            let result = searchByName(child, name);

            if (result) {
                return result;
            }
        }
    }

    return false;
};

然后在 Dash to Dock 所在的 Main.layoutManager.uiGroup 上调用它

const Main = imports.ui.main;

let dashToDock = searchByName(Main.layoutManager.uiGroup, "dashtodockContainer");