How to get Clutter.Actor via its name

359 Views Asked by At

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.

1

There are 1 best solutions below

2
andy.holmes On BEST ANSWER

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");