python gnome gnome-3 wayland

python - ¿Cómo obtengo la ventana activa en Gnome Wayland?



gnome-3 (2)

Antecedentes: estoy trabajando en un software llamado ActivityWatch que registra lo que haces en tu computadora. Básicamente, un intento de abordar algunos de los problemas con: RescueTime, selfspy, arbtt, etc.

Una de las cosas principales que hacemos es registrar información sobre la ventana activa (clase y título). En el pasado, esto se ha hecho usando Linux usando xprop y ahora python-xlib sin problema.

Pero ahora tenemos un problema: Wayland está en aumento y, por lo que puedo ver, Wayland no tiene idea de una ventana activa. Por lo tanto, me temo que tendremos que implementar soporte para todos y cada uno de los entornos de escritorio disponibles para Wayland (asumiendo que proporcionarán la capacidad de obtener información sobre la ventana activa).

Esperemos que eventualmente converjan y tengan una interfaz común para hacer esto, pero no estoy conteniendo la respiración ...

He estado anticipando este problema . Pero hoy recibimos nuestra primera solicitud de usuario de Wayland por un usuario real de Wayland. A medida que las distribuciones más grandes están adoptando Wayland como protocolo de servidor de pantalla predeterminado (Fedora 25 ya lo está utilizando, Ubuntu cambiará en 17.10, lo que vendrá pronto) la situación se volverá más crítica con el tiempo.

Cuestiones relevantes para ActivityWatch:

Hay otras aplicaciones como ActivityWatch que requerirían la misma funcionalidad (RescueTime, arbtt, selfspy, etc.), parece que no son compatibles con Wayland en este momento y no puedo encontrar ningún detalle sobre cómo planean hacerlo.

Ahora estoy interesado en implementar el soporte para que Gnome comience con y continúe con otros a medida que el camino se vuelve más claro.

Aquí se ha formulado una pregunta similar sobre Weston: obtenga la lista de ventanas activas en wayland weston

Edit: pregunté en #wayland en Freenode, obtuve la siguiente respuesta:

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 :)

Edición 2: se archivó un problema de mejora en el controlador de errores Gnome .

tl; dr: ¿Cómo obtengo la ventana activa en Gnome cuando uso Wayland?


En mi opinión, la mejor opción que tiene no es Wayland ni ninguna biblioteca disponible (no hay una). En realidad, quien sabe en gnome-wayland sobre las ventanas activas es Mutter, por lo que necesitas encontrar una manera de preguntar a Mutter las ventanas activas. Gnome puede desarrollar una API para pedir internamente que murmure la ventana activa y restaure la funcionalidad. Pero en realidad, no tienes un lugar para pedirlo. Mutter no desarrollará una API para acceder a su representación interna, ya que esto será muy específico solo de Mutter y no de todos los administradores de ventanas de Wayland. Por lo tanto, esta necesidad debe agregarse a una biblioteca externa, donde esta biblioteca podría hablar probablemente con el administrador de ventanas actual que está en uso para resolver su solicitud de una manera general.

Otra posibilidad es agregar un complemento de Wayland donde todos los administradores de ventanas tengan una manera de compartir las ventanas activas actuales y de alguna manera una biblioteca para hablar directamente con wayland para restaurar la funcionalidad.

Por lo tanto, su aplicación está en un gran problema. Lo más que puedes hacer es solicitar esto en mutter (donde se conocen las ventanas activas), pero en mi opinión no se puede resolver en Mutter.

Espero que esto te ayude y puedas encontrar un camino. Buena suerte.


Tengo un script llamado preguiça.py , que hace exactamente lo que estás haciendo, aunque probablemente sea mucho más sencillo y no lo he lanzado.

Para mi script, adquirí el título de la ventana utilizando el kit de construcción del navegador de ventanas de PyGObject (Wnck).

Aquí hay una versión simplificada del mismo, con las partes esenciales:

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 ()

El código real para lo que está pidiendo está realmente comentado en el ejemplo anterior (no necesité capturar la ventana, ya que la devolución de llamada ya lo recibió), pero puede necesitarlo dependiendo de su implementación.

Lo escribí para X, y no se quejó cuando cambié a Wayland, por lo que probablemente debería funcionar para ti.

Tenga en cuenta que no obtuvo la información de Wayland , como usted lo solicitó, pero probablemente sea mejor, ya que será X / Wayland-agnóstico. Obtuve el título de un xterm que abrí, por lo que también debe ser un juego de herramientas independiente.

Sin embargo, no me preguntes sobre los detalles de la implementación. El código tiene al menos cuatro años de antigüedad :)