Получить идентификатор X Window из процесса в Bash

Есть ли какой-нибудь инструмент / инструмент bash, который мог бы сказать, какие окна были созданы определенным процессом?

3 ответа

Решение
wmctrl -lp

дает мне окна и их PID. Образец вывода:

0x04c00022  0 2168   ciro ciro.santilli - Skype™
0x03c00014  0 2154   ciro Krusader
0x03200022  0 2181   ciro Guake!
...

Как уже упоминалось, вы можете использовать инструменты командной строки, такие как wmctrl или же xprop, Клиенты должны вести себя хорошо _NET_WM_PID свойство pid процесса, который создал главное окно (все популярные наборы инструментов делают это за вас). Обратите внимание, что некоторые клиенты не устанавливают его или могут быть на другом физическом компьютере (вы можете использовать WM_CLIENT_MACHINE свойство) - поэтому используйте эту информацию в качестве подсказки и не полагайтесь на то, чтобы она присутствовала или была точной. Смотрите спецификацию emwh на freedesktop для справки.

Вот несколько решений для управления окнами X11 (в том числе одно к этой проблеме).

Чтобы получить идентификатор окна по его идентификатору процесса, используйте wmctrl следующим образом:

#!/usr/bin/env bash
# getwindidbypid
# 
# Get the ID of a window by PID (if the process has a window).
# 
# Usage:
#   getwindidbypid <PID>
# 

while IFS= read line; do
  if [[ "${line}" =~ (0x)([0-9a-z]+)([ ][- ][0-9]+[ ])([0-9]*) ]]; then
    winId="${BASH_REMATCH[1]}${BASH_REMATCH[2]}"
    pid="${BASH_REMATCH[4]}"
    if [[ "${pid}" -eq "${1}" ]]; then
      WIND_IDS+=("${winId}")
    fi
  fi
done < <(wmctrl -lp)

if [ "${#WIND_IDS[@]}" -gt 0 ]; then
  echo "${WIND_IDS[0]}"
fi

Пример:

user ~ $  getwindidbypid 37248
0x05a00012
Другие вопросы по тегам