【问题标题】:How to get Clutter.Actor via its name如何通过名称获取 Clutter.Actor
【发布时间】:2018-02-04 09:16:34
【问题描述】:

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

我的研究最终在Clutter.Stage 的某个地方结束,这是 Actor(s) 可以附加到的地方,但是根据我的看法,可能有多个阶段设置,所以我可能还必须找到它是哪个阶段我要找的演员在。现在我想知道如何通过名称获取 Actor。

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

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

我能够通过窥镜(Alt + F2 -> lg -> 选择器)获得名称。目前,我想要获取的特定 Actor 是 DashtoDock,仅供参考。

谢谢~希望有人能帮忙。

【问题讨论】:

    标签: gnome-shell clutter gjs


    【解决方案1】:

    不幸的是,您正在寻找的似乎是一个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");
    

    【讨论】:

    • 是的,昨天晚上我发现了同样的结果。因为已经很晚了,所以我自己还没有把它弄到这里,不得不睡觉,但是这是我期望自己实现的,因为我发现没有类似的功能存在。我也应该更彻底地阅读 Clutter 的文档,我一直缺少对象文字属性“名称”。仍然感谢您的回答。我可能会更新以感谢在 GNOME IRC 帮助我的用户。
    • 如果您要查找的内容可能在 uiGroup 之外并且您不知道要查找的内容,那么从 global.state 而不是 Main.layout Manager.uiGroup 开始可能会更好。
    猜你喜欢
    • 2011-09-09
    • 1970-01-01
    • 2021-08-27
    • 2023-03-28
    • 2013-12-25
    • 1970-01-01
    • 2015-06-06
    • 2017-10-09
    • 1970-01-01
    相关资源
    最近更新 更多