Czy można odzyskać proces / tytuł aktywnego okna w Gnome?

28

Potrzebuję rozwiązania, aby uzyskać bieżące informacje o aktywnym (skoncentrowanym) oknie na pulpicie Gnome 2. Najbardziej interesuje mnie proces uruchamiania tego okna i tytułu okna.

Czy to możliwe?

ROZWIĄZANIE:

Uzyskiwanie tytułu okna:

xwininfo -root -children | grep $(printf '%x\n' $(xdotool getwindowfocus)) | grep -oEi '"[^"]+"' | head -1

Uzyskiwanie nazwy procesu:

ps -e | grep $(xdotool getwindowpid $(xdotool getwindowfocus)) | grep -v grep | awk '{print $4}'

lub:

cat /proc/$(xdotool getwindowpid $(xdotool getwindowfocus))/comm
Rogach
źródło

Odpowiedzi:

17

Możesz użyć xdotool , wszechstronnego narzędzia do automatyzacji X-Window.

focused_window_id=$(xdotool getwindowfocus)
active_window_id=$(xdotool getactivewindow)
active_window_pid=$(xdotool getwindowpid "$active_window_id")

(Nie wiem, jaka jest różnica między koncentracją a aktywnością.)

(Myślałem, że wmctrl może to zrobić, ale najwyraźniej nie.)

Gilles „SO- przestań być zły”
źródło
26

To jest tak proste:

xdotool getactivewindow getwindowname

Powodzenia, mam nadzieję, że Ci się uda!

eric
źródło
To działa, czy ktoś może wyjaśnić, dlaczego został odrzucony?
lfzawacki
8

Prostsze (IMO) niż rozwiązania OP (czyli bez ps, grepi awk), aby uzyskać nazwę procesu:

cat /proc/$(xdotool getwindowpid $(xdotool getwindowfocus))/comm

Lub jeśli chcesz koniec linii:

echo $(cat /proc/$(xdotool getwindowpid $(xdotool getwindowfocus))/comm)
Skippy le Grand Gourou
źródło
Tak, cat /proc/jest przyjemny (i prawdopodobnie szybszy, ponieważ nie wymaga grepowania całego pswyjścia). Dodałem go do odpowiedniego rozwiązania, aby przyszli użytkownicy mogli go znaleźć.
Rogach,
4

Wypróbuj komendę xwininfo, http://www.xfree86.org/4.2.0/xwininfo.1.html , zdecydowanie zwraca tytuł okna i jeśli chodzi o proces, cóż ...

X przypisał mu identyfikator i stał się nadrzędnym identyfikatorem PID okna, a także ukrywałby go domyślnie, więc zakładając, że Gnome obsługuje NET_WM_PID, jak pokazuje łatka z 2001 roku, http://mail.gnome.org/ archives / gtk-devel-list / 2001-October / msg00238.html , a następnie możemy przejrzeć ten post, http://www.mail-archive.com/[email protected]/msg05809.html , w którym autor pisze krótki program C do konwersji Window ID na PID, voila.

rhoyerboat
źródło
Ale wygląda na to, że xwininfowymaga ręcznego wybrania potrzebnego okna. Miałem nadzieję, że uda mi się uzyskać skoncentrowane okno z bash.
Rogach
Coś jak w, `xwininfo -root -children | grep -oEi 'Identyfikator okna: (? [0-9a-zA-Z] +) | grep -oEi '(? 0-9a-zA-Z)' - edycja: mój palec poślizgnął się, moje wyrażenie regularne dla okna id było złe. sprawdź tę inną stronę, aby uzyskać inne informacje: davygoat.com/software/rizzle/How_it_works.html
rhoyerboat
To polecenie podaje tylko identyfikator okna „root”, a nie aktywny :(
Rogach
1

Wiem, że pytanie jest stare, ale uważam, że xpropnależy tutaj również wspomnieć. Jest łatwo dostępny pod X. Można go używać w interaktywny sposób:

  1. wpisz xpropi wybierz żądane okno za pomocą kursora myszy
  2. WM_NAMEdaje tytuł okna, _NET_WM_PIDdaje pid

Lub możesz bezpośrednio powiedzieć, xpropktóre okno potrzebujesz, przekazując -idlub -nameopcję. Za pomocą awkmożesz uzyskać identyfikator aktywnego okna i przekazać go w xpropten sposób (pobranego stąd ):

xprop -id $(xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}")

Wreszcie, korzystając z Your Favorite Tool ™ (np. grepLub sed), możesz wyodrębnić potrzebne wartości. Na przykład piddane wyjściowe powyższego polecenia można potokować do sed:sed -nE 's/^_NET_WM_PID.*= ([0-9]+)/\1/p'

jjj
źródło