it-swarm-es.com

wmctrl - enfoca la ventana más reciente de una aplicación

He creado algunos atajos que imitan los de la Unidad Mod4 + num comportamiento.

wmctrl -xa Sublime || subl

Lo que no me gusta es que una vez que lo sublime se está ejecutando, siempre enfoca la primera ventana abierta. Me gustaría enfocar la última ventana "enfocada". Igual que en la Unidad. ¿Hay una bandera para eso?

7
mreq

He creado un conmutador de aplicaciones muy robusto con wmctrl. Verifique mi publicación en los foros de Ubunt y mi respuesta de askubunt .

Este es el script para lanzar:

#!/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
2
mreq

Este script hace lo que quieres:

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

EDITAR: Este script siempre se enfoca en la última ventana enfocada, en lugar de recorrer las ventanas en el orden en que se abrieron.

EDIT 2: modifiqué el script (resulta que wmctrl y xprop usan formatos ligeramente diferentes para mostrar números hexadecimales).

EDITAR 3: el nombre de la aplicación debe tomarse de la tercera columna de wmctrl -lx para evitar ciertos conflictos.

10
Raul Laasner