gnome-shellcluttergjs

How to get Clutter.Actor via its name


I am using GJS, how do I get Clutter.Actor via its name. For example, if I wanted to get GNOME Shell's top panel, how do I get its Clutter.Actor via its name "panel"?

My research ended up somewhere along Clutter.Stage which is where Actor(s) can go be appended to, however by the way I see things, there can be multiple Stages setup so I might also have to find which Stage it is the Actor I am trying to find is at. For now I want to know how I can get an Actor via its name.

I have seen from a code; Main.layoutManager.panelBox to get the GNOME Shell's top panel, however that doesn't seem applicable to my case since it's a third party Actor I am trying to get, and the way I wish to get Actor(s) is via the name since I may be working with different third party Actor(s).

There is one way that I can get this that I know of; Main.layoutManager.panelBox.get_parent().get_children() and I can just get the specific Actor via its index, but I don't think this is the best way to approach this, considering how dynamic things are, secondly, I find this way kinda sloppy so..

I was able to get the name via Looking Glass (Alt + F2 -> lg -> picker). For now, the specific Actor I am trying to get is the DashtoDock's, just for info.

Thank you~ Hope someone can help.


Solution

  • Unfortunately, it seems like what you're looking for is a searchByName() function, but you'll have to implement that yourself I think. Something like (untested):

    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;
    };
    

    Then call it on Main.layoutManager.uiGroup where Dash to Dock is

    const Main = imports.ui.main;
    
    let dashToDock = searchByName(Main.layoutManager.uiGroup, "dashtodockContainer");