web-dev-qa-db-ja.com

wmctrl-アプリの最新のウィンドウにフォーカスする

Unityを模倣したいくつかのショートカットを作成しました Mod4 + num 動作。

wmctrl -xa Sublime || subl

私が好きではないことは、崇高が実行されると、最初に開かれたウィンドウに常に焦点を合わせるということです。最後の「フォーカスされた」ウィンドウに焦点を合わせたい。 Unityと同じです。そのためのフラグはありますか?

7
mreq

wmctrlを使用して、非常に堅牢なアプリスイッチャーを作成しました。 buntuフォーラムの投稿askubuntuの回答 を確認してください。

これは起動するスクリプトです:

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

このスクリプトはあなたが望むことをします:

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

編集:このスクリプトは、開かれた順にウィンドウを切り替えるのではなく、常に最後にフォーカスされたウィンドウにフォーカスします。

編集2:私はスクリプトを修正しました(wmctrlとxpropは16進数を表示するためにわずかに異なるフォーマットを使用することが判明)。

編集3:アプリ名は、特定の競合を避けるために、wmctrl -lxの3列目から取得する必要があります。

10
Raul Laasner