gnome-shell-extensions拖放

时间:2017-10-09 12:55:31

标签: gnome-shell-extensions gjs

在尝试将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中使用它如何将它拉下来?欢迎任何建议!

1 个答案:

答案 0 :(得分:0)

以下是关于Windows之间DND的当前可用shell代码:https://github.com/GNOME/gnome-shell/blob/master/js/ui/xdndHandler.js您几乎无法使用它。

在Mutter中,有一个以上的程序来处理窗口中的拖放,因为X11窗口有一个实现,Wayland窗口有另一个实现。

说实话,我不知道Wayland是否有办法,将会如何。

我可以告诉你,在gnome-shell中(具体来说是Mutter)在X11上没有完全实现这种能力。大多数你都知道,如果从窗口到外壳和拖动的actor的位置发生拖放,但是外壳没有提供任何api来创建内部拖放。 shell到特定窗口。

你可以充分利用的shell拖放,它只是一个内部(只是shell)拖放到shell(仅用于杂乱的actor)而不是在不同窗口之间的外部拖放。

在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上获得支持,我想你需要做类似的事情。

好loock。