2010-11-06 16 views
6

¿Hay alguna forma de saber cuándo un usuario (linux x windows) cambia la ventana activa a través de alt-tab o haga clic en. Quiero escribir una secuencia de comandos que escuche este evento (si ocurre tal evento, la secuencia de comandos continúa para encontrar la ventana activa actual, que sé cómo resolver). También podría seguir sondeando para encontrar la ventana activa actual, pero esa es una mala forma de escribir esto. Esperando obtener una solución que pueda "escuchar" en lugar de "sondear".Capturar cambio en la ventana activa (para Linux)

Gracias!

+0

¿Has encontrado una respuesta? –

Respuesta

1

Mirando brevemente la documentación del módulo Perl X11 :: Tops indica que hay un método monitor_property_and_structure_change. Supongo que las bibliotecas X11 subyacentes proporcionarán la funcionalidad que estás buscando.

0

Conozco el programa KDE de KTimeTracker que hace un seguimiento de cuánto tiempo ha gastado en cada ventana. No sé detalles, ya sea que rastree los eventos de cambio de ventanas activas, o simplemente comprueba periódicamente el estado de todo el escritorio. Sin embargo, las fuentes pueden ser útiles: http://www.kde.org/applications/utilities/ktimetracker/.

0

Tenía una necesidad de hacer eso y mi solución fue ver la propiedad (mantenida por el Administrador de ventanas) en la ventana raíz para los cambios.

Aquí es una copia de la aplicación de pitón-xlib escribí para demostrar a alguien:

import Xlib 
import Xlib.display 

disp = Xlib.display.Display() 
root = disp.screen().root 

NET_ACTIVE_WINDOW = disp.intern_atom('_NET_ACTIVE_WINDOW') 
NET_WM_NAME = disp.intern_atom('_NET_WM_NAME') 

last_seen = {'xid': None} 
def get_active_window(): 
    window_id = root.get_full_property(NET_ACTIVE_WINDOW, 
             Xlib.X.AnyPropertyType).value[0] 

    focus_changed = (window_id != last_seen['xid']) 
    last_seen['xid'] = window_id 

    return window_id, focus_changed 

def get_window_name(window_id): 
    try: 
     window_obj = disp.create_resource_object('window', window_id) 
     window_name = window_obj.get_full_property(NET_WM_NAME, 0).value 
    except Xlib.error.XError: 
     window_name = None 

    return window_name 


if __name__ == '__main__': 
    root.change_attributes(event_mask=Xlib.X.PropertyChangeMask) 
    while True: 
     win, changed = get_active_window() 
     if changed: 
      print(get_window_name(win)) 

     while True: 
      event = disp.next_event() 
      if (event.type == Xlib.X.PropertyNotify and 
        event.atom == NET_ACTIVE_WINDOW): 
       break 

La versión más comentado totalmente es en this gist.

Cuestiones relacionadas