2010-10-21 15 views
14

Próbuję uzyskać tytuł aktywnego okna. Aplikacja jest zadaniem w tle, więc jeśli użytkownik ma otwarte Eclipse, funkcja zwraca "Eclipse - blabla", więc nie otrzymuje tytułu okna mojego okna. Zajmuję się tym w Pythonie 2.6 przy użyciu PyQt4.Uzyskaj aktywny tytuł okna w X

Moje obecne rozwiązanie zapożyczone i lekko zmodyfikowany ze starej odpowiedzi tutaj na SO, wygląda następująco:

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

To działa dla większości okien, ale nie wszystkie. Na przykład nie może znaleźć okna czatu w kopete lub nazwy aplikacji, którą aktualnie rozwijam.

Moja kolejna próba wygląda następująco:

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; 

Ale z jakiegoś powodu okno zawsze jest Brak.

Czy ktoś ma lepszy sposób na uzyskanie bieżącego tytułu okna lub jak zmodyfikować jeden z moich sposobów, który działa dla wszystkich okien?

Edit:

W przypadku ktokolwiek zastanawia to jest tak, jak stwierdził, że wydaje się działać na wszystkich oknach.

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

jest jakiś cel do kopiowania stdout do root_check jeśli stdout jest niepusty? – enthdegree

+1

sprawdź rozwiązanie Alex Spurlings na dole, zabrał tę część. – dutt

Odpowiedz

6

xdotool może to zrobić.

xdotool getactivewindow

+0

Przejrzałem kod źródłowy xdotool i wydaje się, że używają one NET_ACTIVE_WINDOW, napisali komentarz "nieznacznie zmodyfikowana wersja xprop". Ale spróbuję i zobaczę, czy ich drobna modyfikacja sprawdziła się. – dutt

5

zmodyfikowałem swoje rozwiązanie nieznacznie więc powinien działać sprawniej (przechodzi parametry xprop jest zwracane dane potrzebuje więc tylko). Ponadto nie jestem pewien, czy konieczne jest buforowanie wyjścia xprop, więc to zrobiłem. Powinien również skorygować "nie znaleziono aktywnego okna", jeśli z jakiegoś powodu nie może znaleźć aktywnego okna.

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

Miło, użyje tego zamiast tego. Ale myślałem, że już poprawnie zwróciłem "Nie znaleziono aktywnego okna". – dutt

0

można uzyskać aktywnego tytuł okna z xdotool:

$ xdotool getactivewindow getwindowname 
Powiązane problemy