Search code examples
gnome-shellgnome-shell-extensions

st_widget_get_theme_node errors on drag


I'm trying to implement a drag and drop system in the extension I'm developing but I'm running into a problem. As far as I can tell, dnd is implemented by making a draggable object like this

 let draggable = DND.makeDraggable(this.actor)

where this.actor is the Clutter actor I want to drag and drop, and then implementing the necessary callbacks. However, when I do this, Gnome Shell immediately crashes when I start to drag and leaves output on stderr like this

 (gnome-shell:15279): St-ERROR **: st_widget_get_theme_node called on the widget [0x2b3c000 StBoxLayout.window-list-item-box:focused ("extension.js (~/Source/js/Botto...gmail.com) - GVIM")] which is not in the stage.

However, using the Looking Glass to call the get_theme_node method on that specific widget does work perfectly!

Do I have to explicitly add actors to the stage? And how could get_theme_node fail somewhere deep inside the belly of Gnome Shell, but not from the Looking Glass?


Solution

  • It is also necessary to implement a getDragActor and getDragActorSource method on the delegate of the actor you're trying to drag.

    Here is a simple implementation that just drags around a clone of the actor.

    getDragActor: function() {
        return new Clutter.Clone({source: this.actor,
                                       reactive: false,
                                       width: this.actor.get_width(),
                                       height: this.actor.get_height()});
    },
    
    getDragActorSource: function() {
        return this.actor;
    }