0

在尝试将 D&D 支持添加到我正在编写的 gnome-shell-extension 时,我遇到了一些麻烦。我可以为任何打开的窗口创建放置目标,但这就是我设法完成的全部。

我无法区分窗户。我尝试使用global.get_stage().get_actor_at_pos(Clutter.PickMode.ALL, x, y).get_parent().get_parent().get_meta_window().get_wm_class(),但有一半时间它给了我错误的窗口,并且时不时地它只是返回null。另外我不确定如何将信息放入目标中。

我要做的就是将文件 URI 放入浏览器窗口或将文件放入文件管理器。

在 gnome-shell-extensions 中是否有可能,我将如何实现它?任何的建议都受欢迎!

4

1 回答 1

0

以下是有关 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 上获得支持,您将需要做类似的事情。

好锁。

于 2018-01-19T06:39:59.123 回答