在尝试为我正在编写的gnome-shell-extension添加D&D支持时,我遇到了一些麻烦。我可以在任何打开的窗口中创建拖放目标,但这就是我所能做到的全部。
我不能区分窗户。我试着使用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中是可能的吗?我将如何实现它?欢迎任何建议!
发布于 2018-01-19 14:39:59
下面是当前可用的关于窗口间DND的shell代码:https://github.com/GNOME/gnome-shell/blob/master/js/ui/xdndHandler.js,您几乎不能使用它做任何事情。
在Mutter中,有多个过程来处理窗口中的拖放,因为有一个实现用于X11-windows,另一个实现用于Wayland-windows。
老实说,我不知道Wayland上有没有办法,也不知道会怎样。
我可以告诉你,在gnome-shell (具体地说是Mutter)中,没有在X11上完全实现这一功能。大多数人都知道,如果从窗口到shell和被拖动角色的位置发生了拖放,但是shell没有提供任何api来创建从shell到特定窗口的内部拖放。
您可以充分利用的shell拖放,它只是内部(只是shell)与shell之间的拖放(仅适用于杂乱的角色),而不是不同窗口之间的外部拖放。
在X11中,拖放过程仅发生在窗口之间。一个窗口提供被拖动的对象及其与该对象相关联的信息。考虑到第一个窗口提供的信息,另一个窗口(可能是相同的)将接受对象的放置。
由于在shell中无法将所需的信息设置为目标窗口,并且您的图形用户界面位于一个大的顶部窗口(代表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中。在此之后,您将获得支持,但您将需要创建相应的过程,然后调用功能,提供信息,并接收从外壳到窗口的完整事件,以便最终可以在gjs中控制它,但它将只用于X11,而不是Wayland。我想如果你想在Wayland上获得支持,你也需要做一些类似的事情。
锁得很好。
https://stackoverflow.com/questions/46647038
复制相似问题