2017-10-09 81 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提供支持,我想你需要做類似的事情。

好的洛克。