wmctrl - основное фокусное окно приложения

Первоначальный запрос с 2006 года ?! o_O https://bugs.launchpad.net/nautilus/+bug/35347

Будем надеяться ...; -)

1
задан 18 March 2013 в 22:17

1 ответ

Этот скрипт делает то, что вы хотите:

#!/bin/bash

app=$1
workspace=$(wmctrl -d | grep '\*' | cut -d ' ' -f1)
win_list=$(wmctrl -lx | grep $app | grep " $workspace " | awk '{print $1}')

IDs=$(xprop -root|grep "^_NET_CLIENT_LIST_STACKING" | tr "," " ")
IDs=(${IDs##*#})

for (( idx=${#IDs[@]}-1 ; idx>=0 ; idx-- )) ; do
    for i in $win_list; do
        if [ $((i)) = $((IDs[idx])) ]; then
            wmctrl -ia $i
            exit 0
        fi
    done
done

exit 1

EDIT: этот скрипт всегда фокусируется на последнем сфокусированном окне, а не на велосипеде через окна в том порядке, в котором они были открыты.

EDIT 2: я изменил скрипт (получается, что wmctrl и xprop используют несколько разные форматы для отображения шестнадцатеричных чисел).

EDIT 3: имя приложения должно быть взято из 3-го столбца wmctrl -lx to избегать определенных конфликтов.

7
ответ дан 25 May 2018 в 00:24
  • 1
    На этот вопрос уже был дан ответ, и дополнительный ответ может быть полезным, но затем объясните, почему и что это лучшее / отличное решение. – Requist 17 December 2014 в 00:11
  • 2
    Я добавил объяснение, хотя в первой строке уже сказано, что этот скрипт выполняет именно то, что запросил ОП. Принятое решение, хотя и полезно, не делает. – Raul Laasner 17 December 2014 в 00:24
  • 3
    Хороший сценарий, делает именно то, что запросил ОП, странно, что другой ответ принят. Во всяком случае, возможно ли расширить этот скрипт, чтобы он мог также циклически запускать окна одного и того же приложения в хронологическом порядке фокуса? – ThisGuy 4 December 2017 в 21:53
  • 4
    Вы хотите, чтобы цикл прошел в обратном порядке? Я не пробовал, но, возможно, for (( idx=0 ; idx<${#IDs[@]} ; idx++ )) ; do сделает это. – Raul Laasner 5 December 2017 в 19:35
  • 5
    Нет. Текущая версия не проходит цикл вообще, она просто приносит последнее активное окно. Если есть другие открытые окна одного и того же приложения, и если я снова запустил скрипт, он не будет циклически проходить через них. То, что я ищу, - это расширить эту версию, чтобы 1) принести последнее активное окно приложения ($ 1) на передний план, если ни одно из окон приложения не активно, 2) если одно из окон приложения уже активно, активное окно этого приложения и т. д. – ThisGuy 6 December 2017 в 08:25

Другие вопросы по тегам:

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