Существует ли команда Linux для определения окна ID, связанного с данным идентификатором процесса?

Учитывая идентификатор процесса XX, я хотел бы иметь список любого идентификатора окна где _NET_WM_PID = XX. Еще лучше был бы самый старый все еще идентификатор активного окна, если это возможно.

Я очень плохо знаком с Linux, но что я пытаюсь сделать, создают сценарий, который взял бы командную строку, и видеть, существует ли, окна уже открывают принадлежность процессу, вызванному с той же самой командной строкой. Если так, просто фокус набора к тому окну, иначе выполните командную строку для получения нового движения процесса. Мое намерение состоит в том, чтобы использовать это в моем рабочем столе человечности, где я сцеплю этот сценарий в свои easystroke команды жеста мыши, так, чтобы, например, каждый раз я жестикулировал для Gmail, я не получаю совершенно новую сессию Gmail, я просто приведен к моему существующему Gmail окно приложения Chrome. Возможно, существует намного более легкий способ пойти обо всем этом, но я еще не нашел свой путь к нему.

Со справкой я выяснил, как находят PID для командной строки с pgrep и как установить фокус на дескриптор окна с wmctrl, но я застреваю при получении от PID до окна ID.

38
задан amphetamachine 19 May 2017 в 15:55
поделиться

1 ответ

xwininfo и xprop позволяют получить то, что вы хотите, но это немного сложно.

xwininfo позволяет получить все известные окна, а xprop - запросить X об идентификаторе одного окна для вашего параметра _NET_WM_PID.

Пока что хитрый способ сделать это выглядит так:

#!/bin/sh

findpid=$1

known_windows=$(xwininfo -root -children|sed -e 's/^ *//'|grep -E "^0x"|awk '{ print $1 }')

for id in ${known_windows}
do
    xp=$(xprop -id $id _NET_WM_PID)
    if test $? -eq 0; then
        pid=$(xprop -id $id _NET_WM_PID|cut -d'=' -f2|tr -d ' ')

        if test "x${pid}" = x${findpid}
        then
            echo "Windows Id: $id"
        fi
    fi
done

Результат:

mycroft:~ $ ./find_windows.sh 1919
Windows Id: 0x1800748
Windows Id: 0x181b221
Windows Id: 0x1803ad5
Windows Id: 0x181f681
Windows Id: 0x181f658
Windows Id: 0x180006d
Windows Id: 0x1800003
Windows Id: 0x1800001
Windows Id: 0x180001e

Как вы увидите, один процесс может иметь определенное количество известных окон, даже если вы видите только одно на экране.

Возможно, вам стоит получить исходники этих инструментов, чтобы сделать то, что вы хотите.

38
ответ дан 27 November 2019 в 03:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: