56 votes

Comment puis-je obtenir la fenêtre active sur Gnome Wayland?

Contexte: je travaille sur un morceau de logiciel appelé ActivityWatch qui enregistre ce que vous faites sur votre ordinateur. Fondamentalement, une tentative de s'attaquer à certains des problèmes avec: RescueTime, selfspy, arbtt, etc.

L'une des principales choses que nous faisons est un journal d'informations sur la fenêtre active (classe et le titre). Dans le passé, cela a été fait à l'aide sur Linux à l'aide de xprop et maintenant python-xlib sans problème.

Mais maintenant, nous avons un problème: Wayland est à la hausse, et aussi loin que je peux voir Wayland n'a aucune notion d'une fenêtre active. Donc, ma crainte est que nous devrons mettre en place un soutien pour chaque environnement de bureau disponible pour Wayland (en supposant qu'ils vous offrent la possibilité d'obtenir des informations sur la fenêtre active à tous).

J'espère qu'ils finiront par converger et ont en commun certaines de l'interface pour obtenir ce fait, mais je ne retiens pas mon souffle...

J'ai été d'anticiper ce problème. Mais aujourd'hui nous avons eu notre première demande de l'utilisateur pour Wayland soutien par un réel Wayland utilisateur. Que les grandes distributions sont l'adoption de Wayland comme l'affichage par défaut du serveur de protocole (Fedora 25 est déjà, Ubuntu va basculer dans 17.10 qui est à venir bientôt), la situation va devenir plus critique au fil du temps.

Questions pertinentes pour ActivityWatch:

Il existe d'autres applications comme ActivityWatch qui exigent de la même fonctionnalité (RescueTime, arbtt, selfspy, etc.), ils ne semblent pas le support de Wayland, et je ne peux pas trouver toutes les informations sur eux prévoient de le faire.

Maintenant, je suis intéressé par la mise en œuvre de l'appui pour Gnome pour commencer avec, et le suivi avec les autres, comme le chemin devient plus clair.

Une question similaire concernant Weston a été posée ici: obtenir la liste des fenêtres actives dans wayland weston

Edit: j'ai demandé à #wayland sur Freenode, a obtenu la réponse suivante:

15:20:44  ErikBjare    Hello everybody. I'm working on a piece of self-tracking software called ActivityWatch (https://github.com/ActivityWatch/activitywatch). I know this isn't exactly the right place to ask, but I was wondering if anyone knew anything about getting the active window in any Wayland-using DE.
15:20:57  ErikBjare    Created a question on SO: https://stackoverflow.com/questions/45465016/how-do-i-get-the-active-window-on-gnome-wayland
15:21:25  ErikBjare    Here's the issue in my repo for it: https://github.com/ActivityWatch/activitywatch/issues/92
15:22:54  ErikBjare    There are a bunch of other applications that depend on it (RescueTime, selfspy, arbtt, ulogme, etc.) so they'd need it as well
15:24:23  blocage      ErikBjare, in the core protocol you cannot know which windnow has the keyboard or cursor focus
15:24:39  blocage      ErikBjare, in the wayland core protocol *
15:25:10  blocage      ErikBjare, you can just know if your window has the focus or not, it a design choise
15:25:23  blocage      avoid client spying each other
15:25:25  ErikBjare    blocage: I'm aware, that's my reason for concern. I'm not saying it should be included or anything, but as it looks now every DE would need to implement it themselves if these kind of applications are to be supported
15:25:46  ErikBjare    So wondering if anyone knew the teams working with Wayland on Gnome for example
15:26:11  ErikBjare    But thanks for confirming
15:26:29  blocage      ErikBjare, DE should create a custom extension, or use D-bus or other IPC
15:27:31  blocage      ErikBjare, I guess some compositor are around here, but I do not know myself if there is such extension already
15:27:44  blocage      compositor developers *
15:28:36  ErikBjare    I don't think there is (I've done quite a bit of searching), so I guess I need to catch the attention of some DE developers
15:29:16  ErikBjare    Thanks a lot though
15:29:42  ErikBjare    blocage: Would you mind if I shared logs of our conversation in the issue?                                     
15:30:05  blocage      just use it :) it's public                                                                                               
15:30:19  ErikBjare    ty :)

Edit 2: Déposé une amélioration de problème dans le Gnome le bugtracker.

tl;dr: Comment puis-je obtenir la fenêtre active sur Gnome lors de l'utilisation de Wayland?

3voto

lestcape Points 164

À mon avis le meilleur choix que vous avez n'est pas Wayland ou de toute disposition de la bibliothèque (il n'y a pas un). D'ailleurs qui sait dans gnome-wayland sur les fenêtres actives est Mutter, de sorte que vous besoin de trouver un moyen de demander à Murmurer les fenêtres actives. Gnome peut élaboration d'une API interne à demander à murmurer la fenêtre active et de restauration de la fonctionnalité. Mais vraiment, vous n'avez pas un endroit pour le demander. Mutter de ne pas développer une API pour accéder à sa représentation interne, parce que ce sera assez spécifique de Mutter seulement et non pas à toutes les Wayland gestionnaire de windows. Donc, ce besoin d'être ajoutés à une bibliothèque externe, où cette bibliothèque pourrait parler probablement avec l'actuel gestionnaire de fenêtres qu'il est en cours d'utilisation afin de résoudre votre demande d'une manière générale.

Une autre possibilité est d'ajouter un Wayland plug-in où tous les windows manager aura une façon de partager le windows active en cours et en quelque sorte une bibliothèque de parler directement avec wayland pour restaurer la fonctionnalité.

Ainsi, votre application est dans un gros problème. Le plus vous pouvez faire est de demander cela sur mutter (où est le savoir de l'actif de windows), mais à mon avis, il ne peut pas être résolu en Mutter.

J'espère que cela vous aidera et vous pouvez trouver un moyen. Bon loock.

-4voto

caxcaxcoatl Points 407

J'ai un script qui s'appelle preguiça.py, qui fait exactement ce que vous faites, même si elle est probablement beaucoup plus simple et je n'ai pas sorti d'album.

Pour mon script, j'ai acquis le titre de la fenêtre à l'aide de PyGObject de la Fenêtre du Navigateur Kit de Construction (Wnck).

Voici une version simplifiée, avec la essencial parties:

from gi.repository import Wnck
from gi.repository import GObject

def changed (screen, window, data):
    print ("Changed!")
#    window = screen.get_active_window()
    if window:
        print ("Title: %s" % window.get_name())

screen = Wnck.Screen.get_default ()
screen.connect ("active-window-changed", changed, None)

mainLoop = GObject.MainLoop ()

try:
    mainLoop.run ()
except KeyboardInterrupt:
    print ("Hey")

mainLoop.unref ()

Le code actuel pour ce que vous demandez est en fait commentée sur l'exemple ci-dessus (je n'ai pas besoin de la capture de la fenêtre, comme le rappel reçoit déjà), mais vous pourriez en avoir besoin en fonction de votre mise en œuvre.

Je l'ai écrit pour X, et il ne se plaint pas quand je suis passé à Wayland, donc il devrait probablement travailler pour vous.

Remarque il n'a pas obtenir de l'information à partir de Wayland, comme vous l'avez demandé, mais il est probablement mieux, car il sera X/Wayland-agnostique. Il a obtenu le titre à partir d'un xterm je l'ai ouvert, il devrait donc être d'outils de l'agnostique, ainsi.

Ne me demandez pas les détails de la mise en œuvre, bien que. Le code est au moins quatre ans :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X