wmctrl - 聚焦應用程式的最近視窗

wmctrl - 聚焦應用程式的最近視窗

我創建了一些模仿 Unity 的Mod4+num行為的快捷方式。

wmctrl -xa Sublime || subl

我不喜歡的是,一旦 Sublime 運行,它總是聚焦在第一個打開的視窗。我想聚焦最後一個「聚焦」視窗。與 Unity 中相同。有一個標誌嗎?

答案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

編輯:此腳本始終關注最後一個聚焦的窗口,而不是按照窗口打開的順序循環瀏覽窗口。

編輯2:我修改了腳本(結果wmctrl和xprop使用稍微不同的格式來顯示十六進位數字)。

編輯 3:應用程式名稱應取自 wmctrl -lx 的第三列,以避免某些衝突。

答案2

我使用 製作了一個非常強大的應用程式切換器wmctrl。檢查我的Ubuntu 論壇貼文和我的阿斯庫本圖答案

這是要啟動的腳本:

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

答案3

我結合了之前的兩個答案,我覺得很方便。它能夠:

  • 將焦點設定到應用程式最近聚焦的視窗(Raul Laasner 的回答)如果該視窗尚未獲得焦點;
  • 否則,循環到應用程式的下一個視窗(mreq 的答案);
  • 如果應用程式沒有窗口,請打開一個窗口(現在有一個可選的第二個參數,用於指定在這種情況下運行的命令)。

這是腳本:

#!/bin/bash
if [ $# -lt 1 ] ; then
  echo "Usage : $0 <window name> [<command to run if there is no window with that name>]"
  exit 1
fi

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}'`

# Get the id of the active window (i.e., window which has the focus)
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

# If the window currently focused matches the first argument, seek the id of the next window in win_list which matches it
if [[ "$win_list" == *"$active_win_id"* ]]; then

    # Get next window to focus on 
    # (sed removes the focused window and the previous windows from the list)
    switch_to=`echo $win_list | sed s/.*$active_win_id// | awk '{print $1}'`

    # If the focused 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 the currently focused window does not match the first argument
else

    # Get the list of all the windows which do
    win_list=$(wmctrl -lx | grep $app_name | awk '{print $1}')

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

   # For each window in focus order
    for (( idx=${#IDs[@]}-1 ; idx>=0 ; idx-- )) ; do
        for i in $win_list; do

           # If the window matches the first argument, focus on it
            if [ $((i)) = $((IDs[idx])) ]; then
                wmctrl -ia $i
                exit 0
            fi
        done
    done
fi

# If a window to focus on has been found, focus on it
if [[ -n "${switch_to}" ]]
then
    (wmctrl -ia "$switch_to") &

# If there is no window which matches the first argument
else

    # If there is a second argument which specifies a command to run, run it
    if [[ -n "$2" ]]
    then
        ($2) &
    fi
fi

exit 0

用法範例:

focus_window.sh vlc vlc
focus_window.sh gnome-control-center gnome-control-center
focus_window.sh gnome-terminal gnome-terminal

答案4

雖然遲到了,但在我的例子中,使用 Firefox 成功地完成了工作:

/usr/lib/firefox/firefox && sleep 0.5 && wmctrl -ia $(wmctrl -l Firefox | grep "Mozilla Firefox" | sort -r | head -n 1 | cut -d " " -f 1)

解釋:

/usr/lib/firefox/firefox- 打開火狐瀏覽器

sleep 0.5- 給視窗一些時間來打開

wmctrl -ia- 關注特定視窗 ID

$(wmctrl -l Firefox | grep "Mozilla Firefox" | sort -r | head -n 1 | cut -d " " -f 1)- 取得最後一個視窗 ID,在我的例子中,該視窗在主頁上打開,因此其名稱為「Mozilla Firefox」。

相關內容