2010-10-21 9 views
14

Ich versuche, den Titel des aktiven Fensters zu bekommen. Die Anwendung ist eine Hintergrundaufgabe. Wenn der Benutzer Eclipse geöffnet hat, gibt die Funktion "Eclipse - blabla" zurück, so dass der Fenstertitel meines eigenen Fensters nicht angezeigt wird. Ich entwickle das in Python 2.6 mit PyQt4.Aktiviere Fenstertitel in X

Meine aktuelle Lösung, entlehnt und leicht von einer alten Antwort hier so modifiziert, sieht wie folgt aus:

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\"') 

Es funktioniert für die meisten Fenster, aber nicht alle. Zum Beispiel kann es mein Kopete-Chat-Fenster oder den Namen der Anwendung, die ich gerade entwickle, nicht finden.

Mein nächster Versuch sieht wie folgt aus:

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; 

Aber aus irgendeinem Grund Fenster ist immer Keine.

Hat jemand eine bessere Möglichkeit, den aktuellen Fenstertitel zu erhalten oder eine meiner Möglichkeiten zu ändern, die für alle Fenster funktioniert?

Edit:

Falls jemand fragt, dies ist die Art, wie ich festgestellt, dass für alle Fenster zu funktionieren scheint.

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

gibt es einen Zweck stdout zu kopieren root_check wenn stdout nicht leer ist? – enthdegree

+1

check out Alex Spurling Lösung weiter unten, er hat diesen Teil herausgenommen. – dutt

Antwort

6

xdotool kann das tun.

xdotool getactivewindow

+0

Ich schaute durch den Quellcode von xdotool und es scheint NET_ACTIVE_WINDOW auch zu verwenden, sie haben einen Kommentar geschrieben "eine leicht modifizierte Version von xprop". Aber ich werde es versuchen und sehen, ob ihre leichte Modifikation es funktioniert hat. – dutt

5

ich Ihre Lösung leicht modifiziert, so dass es effizienter ausgeführt werden soll (es geht Parameter so xprop nur die Daten, die er benötigt wird zurückgegeben). Außerdem bin ich nicht sicher, dass es notwendig ist, die Ausgabe von xprop zu puffern, also nahm ich das heraus. Es sollte auch die Rückgabe "Active window not found" korrigieren, wenn das aktive Fenster aus irgendeinem Grund nicht gefunden werden kann.

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

Schön, werde das stattdessen verwenden. Aber ich dachte, ich habe bereits "Active window not found" korrekt zurückgegeben. – dutt

0

Sie können das aktive Fenster Titel mit xdotool erhalten:

$ xdotool getactivewindow getwindowname 
Verwandte Themen