2017-10-09 45 views
0

虽然试图将D & D支持添加到我正在编写的gnome-shell扩展中,但遇到了一些麻烦。我可以为任何打开的窗口创建放置目标,但这是我设法实现的一切。gnome-shell-extensions拖放

我无法区分窗口。我试图使用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中,我将如何将它取出来?任何的建议都受欢迎!

回答

0

以下是当前可用的有关窗口之间DND的shell代码:https://github.com/GNOME/gnome-shell/blob/master/js/ui/xdndHandler.js您几乎可以做任何事情。

在Mutter中,有多个过程来处理窗口中的拖放操作,这是因为X11-windows和Wayland-windows的另一个实现有一个实现。

说实话,我不知道Wayland有没有办法,以及如何。

我可以告诉你,在gnome-shell(Mutter具体)中,X11没有完全实现这个功能。大多数人可以知道,如果从窗口拖放到外壳以及被拖动的actor的位置,但shell不提供任何API来创建从外壳拖放到特定窗口的任何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提供支持,我想你需要做类似的事情。

好的洛克。