2017-10-09 7 views
0

Tout en essayant d'ajouter D & support D à une extension de gnome-shell que je vous écris, je suis tombé sur un peu de mal. Je peux créer des cibles de largage sur n'importe quelle fenêtre ouverte, mais c'est tout ce que j'ai réussi à faire.gnome-shell-extensions glisser-déposer

Je ne peux pas différencier les fenêtres. J'ai essayé d'utiliser global.get_stage().get_actor_at_pos(Clutter.PickMode.ALL, x, y).get_parent().get_parent().get_meta_window().get_wm_class(), mais la moitié du temps il me donne la mauvaise fenêtre et de temps en temps il renvoie juste null. Aussi, je ne suis pas sûr de savoir comment faire tomber l'information dans la cible.

Tout ce que je suis en train de faire est de déposer un URI fichier dans une fenêtre de navigateur ou le fichier dans un gestionnaire de fichiers.

Est-il même possible dans gnome-shell-extensions et comment pourrais-je retirer? N'importe quel conseil est le bienvenu!

Répondre

0

Voici le code shell actuellement disponibles au sujet du MDN entre les fenêtres: https://github.com/GNOME/gnome-shell/blob/master/js/ui/xdndHandler.js Vous pouvez faire pratiquement rien avec elle.

En Mutter, il y a plus d'une procédure de traité un glisser-déposer dans une fenêtre, parce qu'il ya une mise en œuvre pour les fenêtres X11 et une autre mise en œuvre pour les fenêtres Wayland.

Pour être honnête, je ne sais pas s'il y a un moyen sur Wayland et comment.

Je peux vous dire que dans gnome-shell (Mutter pour être précis) il n'y a pas pleinement mise en œuvre de cette capacité sur X11. Le plus que vous pouvez savoir, c'est si un glisser-déposer se produit à partir d'une fenêtre sur le shell et la position de l'acteur déplacé, mais le shell ne fournit aucune API pour créer un glisser-déposer interne vers une fenêtre particulière.

Le shell glisser-déposer que vous pouvez utiliser pleinement, c'est seulement un glisser-déposer interne (juste le shell) de et vers le shell (seulement pour les acteurs de fouillis) et non externe entre différentes fenêtres.

Dans X11, le processus glisser-déposer se produit uniquement entre les fenêtres. Une fenêtre fournit l'objet déplacé et les informations associées à cet objet. L'autre fenêtre (pourrait être la même) acceptera la goutte de l'objet, en tenant compte des informations que la première fenêtre fournit. Comme il n'est pas possible dans le shell de définir les informations requises dans la fenêtre cible et que votre interface graphique soit dans une grande fenêtre supérieure (la fenêtre qui représente l'étape globale du shell: https://github.com/GNOME/mutter/blob/6c18bae83cd27a7397a1ed0c1c0c81b282f1b44e/src/compositor/meta-dnd.c#L152) et comme vous ne le faites pas N'avez pas accès à cette grande fenêtre interne, enfin vous ne pouvez rien faire pour interagir directement avec d'autres fenêtres.

Ici (https://github.com/swayfreeda/blender-2.77a/tree/5969d704f44952ea8cbecba2ba4150fb4a48e6de/extern/xdnd) vous pouvez trouver une implémentation complète du glisser-déposer sur X11, vous devrez modifier le code pour l'adapter au flux Mutter, puis ajouter ce code à Mutter. Après cela, vous aurez le support, mais vous devrez créer la procédure correspondante pour ensuite invoquer les fonctionnalités, fournir des informations et récupérer des événements utiles du shell à la fenêtre, pour finalement pouvoir le contrôler dans gjs, mais ce sera seulement pour X11, pas pour Wayland. Je suppose que vous devrez faire quelque chose de similaire si vous voulez un soutien sur Wayland.

Bon loock.