Question

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?

Was it helpful?

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;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top