wmctrl - fokussiere das letzte Fenster einer App

7

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?

mreq
quelle

Antworten:

10

Dieses Skript macht was Sie wollen:

#!/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.

Raul Laasner
quelle
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.
ThisGuy
3

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:

#!/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
mreq
quelle
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.
Mreq