2010-10-21 18 views
14

Estoy tratando de obtener el título de la ventana activa. La aplicación es una tarea en segundo plano, por lo que si el usuario tiene Eclipse abierto, la función devuelve "Eclipse - blabla", por lo que no obtiene el título de la ventana de mi propia ventana. Estoy desarrollando esto en Python 2.6 usando PyQt4.Obtiene el título activo de la ventana en X

Mi solución actual, prestado y ligeramente modificada de una vieja respuesta aquí en SO, tiene el siguiente aspecto:

def get_active_window_title(): 
    title = '' 
    root_check = '' 

    root = Popen(['xprop', '-root'], stdout=PIPE) 

    if root.stdout != root_check: 
     root_check = root.stdout 

     for i in root.stdout: 
      if '_NET_ACTIVE_WINDOW(WINDOW):' in i: 
       id_ = i.split()[4] 
       id_w = Popen(['xprop', '-id', id_], stdout=PIPE) 

     for j in id_w.stdout: 
      if 'WM_ICON_NAME(STRING)' in j: 
       if title != j.split()[2]: 
        return j.split("= ")[1].strip(' \n\"') 

Funciona para la mayoría de las ventanas, pero no todos. Por ejemplo, no puede encontrar mis ventanas de chat kopete, o el nombre de la aplicación que estoy desarrollando actualmente.

Mi siguiente intento se ve así:

def get_active_window_title(self): 
    screen = wnck.screen_get_default() 
    if screen == None: 
     return "Could not get screen" 
    window = screen.get_active_window() 
    if window == None: 
     return "Could not get window" 
    title = window.get_name() 
    return title; 

Pero por alguna razón ventana siempre es Ninguno.

¿Alguien tiene una forma mejor de obtener el título actual de la ventana, o cómo modificar uno de mis métodos, que funciona para todas las ventanas?

Editar:

En caso de que alguien se pregunta este es el camino me encontré con que parece que funciona para todas las ventanas.

def get_active_window_title(self): 
    root_check = '' 
    root = Popen(['xprop', '-root'], stdout=PIPE) 

    if root.stdout != root_check: 
     root_check = root.stdout 

     for i in root.stdout: 
      if '_NET_ACTIVE_WINDOW(WINDOW):' in i: 
       id_ = i.split()[4] 
       id_w = Popen(['xprop', '-id', id_], stdout=PIPE) 
     id_w.wait() 
     buff = [] 
     for j in id_w.stdout: 
      buff.append(j) 

     for line in buff: 
      match = re.match("WM_NAME\((?P<type>.+)\) = (?P<name>.+)", line) 
      if match != None: 
       type = match.group("type") 
       if type == "STRING" or type == "COMPOUND_TEXT": 
        return match.group("name") 
     return "Active window not found" 
+0

hay un propósito a la copia de la salida estándar a la salida estándar root_check si no está vacío? – enthdegree

+1

echa un vistazo a la solución de Alex Spurlings más abajo, él ha tomado esa parte. – dutt

Respuesta

6

xdotool puede hacer eso.

xdotool getactivewindow

+0

Miré a través del código fuente de xdotool y parece usar NET_ACTIVE_WINDOW también, escribieron un comentario "una versión ligeramente modificada de xprop". Pero lo probaré y veré si su ligera modificación lo hizo funcionar. – dutt

5

he modificado ligeramente su solución por lo que debe funcionar de manera más eficiente (que pasa parámetros a xprop por lo que sólo se devuelve los datos que necesita). Además, no estoy seguro de que sea necesario proteger la salida de xprop, así que lo eliminé. También debería corregir el resultado "Ventana activa no encontrada" si, por algún motivo, no puede encontrar la ventana activa.

def get_active_window_title(self): 
    root = Popen(['xprop', '-root', '_NET_ACTIVE_WINDOW'], stdout=PIPE) 

    for line in root.stdout: 
     m = re.search('^_NET_ACTIVE_WINDOW.* ([\w]+)$', line) 
     if m != None: 
      id_ = m.group(1) 
      id_w = Popen(['xprop', '-id', id_, 'WM_NAME'], stdout=PIPE) 
      break 

    if id_w != None: 
     for line in id_w.stdout: 
      match = re.match("WM_NAME\(\w+\) = (?P<name>.+)$", line) 
      if match != None: 
       return match.group("name") 

    return "Active window not found" 
+0

Bueno, usaré esto en su lugar. Pero pensé que ya devolví correctamente "Ventana activa no encontrada". – dutt

0

Usted puede obtener el título de la ventana activa con xdotool:

$ xdotool getactivewindow getwindowname 
Cuestiones relacionadas