gnome-shell-extensions перетаскивание

Пытаясь добавить поддержку D&D в расширение gnome-shell, которое я пишу, я столкнулся с небольшой проблемой. Я могу создавать цели для перетаскивания в любое открытое окно, но это все, что мне удалось сделать.

Я не могу различить окна. Я пытался использовать 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 и как мне это осуществить? Любой совет приветствуется!


person varikas    schedule 09.10.2017    source источник


Ответы (1)


Вот текущий доступный код оболочки для DND между окнами: https://github.com/GNOME/gnome-shell/blob/master/js/ui/xdndHandler.js С ним практически ничего нельзя сделать.

В Mutter есть более одной процедуры для обработки перетаскивания в окне, потому что есть одна реализация для окон X11 и другая реализация для окон Wayland.

Честно говоря, я не знаю, есть ли путь на Wayland и как он будет.

Я могу сказать вам, что в gnome-shell (точнее, в Mutter) нет полной реализации этой возможности на X11. Большинство из них, которые вы можете знать, это когда происходит перетаскивание из окна в оболочку и положение перетаскиваемого актера, но оболочка не предоставляет никакого API для создания внутреннего перетаскивания из оболочки в конкретное окно.

Перетаскивание оболочки, которое вы можете полностью использовать, это только внутреннее (просто оболочка) перетаскивание из оболочки и в нее (только для агентов беспорядка), а не внешнее между разными окнами.

В X11 процесс перетаскивания происходит только между окнами. Одно окно предоставляет перетаскиваемый объект и информацию, связанную с этим объектом. Другое окно (может быть то же самое) примет удаление объекта с учетом информации, предоставленной первым окном.

Поскольку в оболочке нет возможности установить требуемую информацию в целевом окне, и, как и ваш графический интерфейс, находится внутри большого верхнего окна (окно, представляющее глобальную стадию оболочки: https://github.com/GNOME/бормотание/BLOB/6c18bae83cd27a7397a1ed0c1c0c81b282f1b44e/SRC/компоновщик/мета-dnd.c#L152) и, поскольку у вас нет доступа к этому большому внутреннему окну, вы, наконец, ничего не можете сделать для прямого взаимодействия с другими окнами.

Здесь (https://github.com/swayfreeda/blender-2.77a/tree/5969d704f44952ea8cbecba2ba4150fb4a48e6de/extern/xdnd) вы можете найти полную реализацию перетаскивания на X11, вам нужно будет изменить код, чтобы адаптировать его к рабочему процессу Mutter, а затем добавить этот код в Mutter. После этого у вас будет поддержка, но вам нужно будет создать соответствующую процедуру, чтобы затем вызывать функции, предоставлять информацию и получать полезные события из оболочки в окно, чтобы можно было окончательно управлять им в gjs, но это будет только для X11, не для Wayland. Я полагаю, вам нужно будет сделать что-то подобное, если вы хотите получить поддержку на Wayland.

Хороший вид.

person lestcape    schedule 19.01.2018