Ich habe einige Verknüpfungen erstellt die Unity imitiert Mod4+ numVerhalten.
wmctrl -xa Sublime || subl
Was ich nicht mag, ist, dass sobald das Erhabene läuft, es immer das erste geöffnete Fenster fokussiert. Ich möchte das letzte "fokussierte" Fenster fokussieren. Gleich wie in Unity. Gibt es dafür eine Flagge?
#!/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
BEARBEITEN: Dieses Skript konzentriert sich immer auf das zuletzt fokussierte Fenster, im Gegensatz zum Durchlaufen der Fenster in der Reihenfolge, in der sie geöffnet wurden.
EDIT 2: Ich habe das Skript geändert (es stellt sich heraus, dass wmctrl und xprop leicht unterschiedliche Formate für die Anzeige von Hexadezimalzahlen verwenden).
BEARBEITEN 3: Der Name der App sollte aus der 3. Spalte von wmctrl -lx entnommen werden, um bestimmte Konflikte zu vermeiden.
Die Frage wurde bereits beantwortet. Eine zusätzliche Antwort kann hilfreich sein, aber dann erklären, warum und was dies eine bessere / andere Lösung ist.
Requist
1
Ich habe eine Erklärung hinzugefügt, obwohl in der ersten Zeile bereits steht, dass dieses Skript genau das tut, was das OP verlangt hat. Die akzeptierte Lösung ist zwar nützlich, aber nicht.
Raul Laasner
Nettes Skript, macht genau das, wonach das OP gefragt hat, es ist seltsam, dass die andere Antwort akzeptiert wird. Wie auch immer, ist es möglich, dieses Skript so zu erweitern, dass es auch Fenster derselben Anwendung in chronologischer Fokusreihenfolge durchlaufen kann?
ThisGuy
Meinen Sie damit, dass die Schleife in umgekehrter Reihenfolge abläuft? Ich habe es nicht versucht, werde es aber vielleicht for (( idx=0 ; idx<${#IDs[@]} ; idx++ )) ; dotun.
Raul Laasner
Nein. Die aktuelle Version durchläuft überhaupt keine Schleife, sondern bringt nur das letzte aktive Fenster. Wenn andere Fenster derselben App geöffnet sind und ich das Skript erneut ausführe, werden sie nicht durchlaufen. Was ich suche, ist, diese Version so zu erweitern, dass 1) das letzte aktive Fenster der App ($ 1) in den Vordergrund gerät, wenn keines der App-Fenster derzeit aktiv ist, 2) wenn eines der App-Fenster bereits aktiv ist, zuvor bringen aktives Fenster dieser App usw.
#!/bin/bash
app_name=$1
workspace_number=`wmctrl -d | grep '\*' | cut -d' ' -f 1`
win_list=`wmctrl -lx | grep $app_name | grep " $workspace_number " | awk '{print $1}'`
active_win_id=`xprop -root | grep '^_NET_ACTIVE_W' | awk -F'# 0x' '{print $2}' | awk -F', ' '{print $1}'`
if [ "$active_win_id" == "0" ]; then
active_win_id=""
fi
# get next window to focus on, removing id active
switch_to=`echo $win_list | sed s/.*$active_win_id// | awk '{print $1}'`
# if the current window is the last in the list ... take the first one
if [ "$switch_to" == "" ];then
switch_to=`echo $win_list | awk '{print $1}'`
fi
if [[ -n "${switch_to}" ]]
then
(wmctrl -ia "$switch_to") &
else
if [[ -n "$2" ]]
then
($2) &
fi
fi
exit 0
Dies geht also nicht direkt zum zuletzt fokussierten Fenster, sondern lässt Sie stattdessen die Fenster der Anwendung in der Reihenfolge durchlaufen, in der sie geöffnet wurden. Wirklich schönes Skript .... (ich benutze es).
jonS90
Genau. Froh, dass Sie es mögen. Ich habe einen ganz minimalen wmctrl-Kachelmanager (auch bekannt als Skript) erstellt und werde ihn hoffentlich bald veröffentlichen.
for (( idx=0 ; idx<${#IDs[@]} ; idx++ )) ; do
tun.Ich habe einen sehr robusten App-Umschalter mit erstellt
wmctrl
. Überprüfen Sie meinen Beitrag in den Ubuntu-Foren und meine Antwort auf askubuntu .Dies ist das zu startende Skript:
quelle