Вот еще одно решение, придерживающееся пути UNIX!
На первый взгляд, это не так красиво, как у вас, @ t7ko:
xdotool search --onlyvisible --class 'gvim' getwindowpid %@ | xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry | sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'
Но потерпи меня! В этом есть какая-то скрытая красота.
Короче говоря, это
- имеет линейную структуру вместо древовидной структуры, например одно вместо двух измерений
- использует более известный синтаксис оболочки .
- действительно отвечает на ваш вопрос: он находит окно.
(Являются ли эти моменты преимуществами, зависит от контекста - давайте просто проигнорируем этот аспект * .)
Я покажу тот же код в более структурированном макете ниже, чтобы его было легче понять шаг за шагом.
Но обратите внимание, что отступ - это объяснение команды - она не указывает на вложение или что-то в этом роде, все по-прежнему является линейным конвейером UNIX.
Та же команда, только что разделенная после каналов ( |):
xdotool search --onlyvisible --class 'gvim' getwindowpid %@ |
xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry |
sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'
Полная команда, как показано выше, дает расположение gvimокна в пикселях, возвращая координаты пикселей относительно верхнего левого угла текущего (возможно, виртуального) экрана, как x,y, например 42,433, или, возможно, -5375,-3809когда он находится на первом из четырех на четырех виртуальных экранах и текущий находится где-то справа.
Пока я сокращу команду, чтобы найти только идентификатор окна X11 - возможно, это все, что было на самом деле нужно OP, не уверен:
Сокращенный конвейер команд, отдельная команда оболочки в каждой строке:
xdotool search --onlyvisible --class 'gvim' getwindowpid %@ |
xargs -I{} xdotool search --all --pid {} --name 'TODO'
Теперь он начинает читаться:
xdotool \
search --onlyvisible --class 'gvim' \
getwindowpid %@ |
xargs -I{} \
xdotool search --all --pid {} --name 'TODO'
xdotoolКоманда searchиспользуется для поиска окна с « класс » gvim, в результате чего некоторые «внутренние» окна. Результат указан как PID's (идентификаторы процесса).
Для каждого PID, xargsработает другое xdotool search, проверяя «имя» для нашего примера шаблона TODO- после проверки для PID.
(На всякий случай: строки, оканчивающиеся на \- называемые линиями продолжения - должны на самом деле заканчиваться \символом «пробел» и без пробелов перед новой строкой.)
Теперь вернемся к исходной команде:
xdotool \
search --onlyvisible --class 'gvim' \
getwindowpid %@ |
xargs -I{} \
xdotool \
search --all --pid {} --name 'TODO' \
getwindowgeometry |
sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'
В оставшейся части перечислены некоторые подробности об окне, включая положение. Команда sedсоответствует и возвращает только x,yзначение позиции.
Например, запустив команду сверху на моем 16-м виртуальном экране (из 4 на 4) с надписью «TODO» gvimна экране 1:
$ xdotool search --onlyvisible --class 'gvim' getwindowpid %@ | xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry | sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'
-7653,-4732
*) Отказ от ответственности: я предпочитаю код @ t7ko. Много!
xdotoolотстой ... это такая простая операция, и нет способа сделать это элегантно.