以下是有关 Windows 之间 DND 的当前可用 shell 代码:https ://github.com/GNOME/gnome-shell/blob/master/js/ui/xdndHandler.js你几乎可以用它做任何事情。
在 Mutter 中,处理窗口中拖放的过程不止一个,因为 X11-windows 有一个实现,Wayland-windows 有另一个实现。
老实说,我不知道 Wayland 上是否有办法以及如何。
我可以告诉你,在 gnome-shell(具体来说是 Mutter)中,X11 上没有完全实现此功能。您可能知道的大多数情况是,如果从窗口到外壳的拖放以及被拖动角色的位置,但外壳不提供任何 api 来创建从外壳到特定窗口的内部拖放。
您可以充分使用的外壳拖放,它只是从外壳拖放到外壳的内部(仅外壳)拖放(仅适用于杂乱演员),而不是不同窗口之间的外部拖放。
在 X11 中,拖放过程只发生在窗口之间。一个窗口提供拖动的对象以及它与该对象相关联的信息。考虑到第一个窗口提供的信息,另一个窗口(可能相同)将接受对象的放置。
由于在 shell 中无法将所需信息设置到目标窗口,并且您的 GUI 位于一个大的顶部窗口内(代表 shell 全局阶段的窗口:https ://github.com/GNOME/ mutter/blob/6c18bae83cd27a7397a1ed0c1c0c81b282f1b44e/src/compositor/meta-dnd.c#L152),就像你无法访问这个大的内部窗口一样,最后你不能做任何事情来直接与其他窗口交互。
在这里(https://github.com/swayfreeda/blender-2.77a/tree/5969d704f44952ea8cbecba2ba4150fb4a48e6de/extern/xdnd)您可以找到在 X11 上拖放的完整实现,您需要修改代码以适应Mutter 工作流程,然后将此代码添加到 Mutter。之后您将获得支持,但您将需要创建相应的程序然后调用功能,提供信息并从 shell 到窗口接收有用的事件,以便最终可以在 gjs 中控制它,但这仅适用于X11,不适用于 Wayland。我想如果您想在 Wayland 上获得支持,您将需要做类似的事情。
好锁。