我想要改变Alt+Tab行为,或者最好设置不同的热键组合以从左到右的方式循环浏览所有窗口,其中最近使用的 MRU 不适用。
在搜索过程中,我找到了在 Windows 或compiz
其他发行版中执行此操作的方法,但在 Ubuntu 中却找不到可用的方法。
答案1
从左到右循环切换窗口
(仅在当前视口,或跨所有视口)
下面的脚本添加到快捷键后将从左到右循环显示您的窗口:
剧本
#!/usr/bin/env python3
import subprocess
from operator import itemgetter
import sys
this_ws = True if "oncurrent" in sys.argv[1:] else False
nxt = -1 if "backward" in sys.argv[1:] else 1
def get(command):
try:
return subprocess.check_output(command).decode("utf-8").strip()
except subprocess.CalledProcessError:
pass
def exclude(w_id):
# exclude window types; you wouldn't want to incude the launcher or Dash
exclude = ["_NET_WM_WINDOW_TYPE_DOCK", "_NET_WM_WINDOW_TYPE_DESKTOP"]
wdata = get(["xprop", "-id", w_id])
return any([tpe in wdata for tpe in exclude])
if this_ws:
# if only windows on this viewport should be picked: get the viewport size
resdata = get("xrandr").split(); index = resdata.index("current")
res = [int(n.strip(",")) for n in [resdata[index+1], resdata[index+3]]]
# get the window list, geometry
valid = [w for w in sorted([[w[0], int(w[2]), int(w[3])] for w in [
l.split() for l in get(["wmctrl", "-lG"]).splitlines()
]], key = itemgetter(1)) if not exclude(w[0])]
# exclude windows on other viewports (if set)
if this_ws:
valid = [w[0] for w in valid if all([
0 <= w[1] < res[0], 0 <= w[2] < res[1]
])]
else:
valid = [w[0] for w in valid]
# get active window
front = [l.split()[-1] for l in get(["xprop", "-root"]).splitlines() if \
"_NET_ACTIVE_WINDOW(WINDOW)" in l][0]
# convert xprop- format for window id to wmctrl format
current = front[:2]+((10-len(front))*"0")+front[2:]
# pick the next window
try:
next_win = valid[valid.index(current)+nxt]
except IndexError:
next_win = valid[0]
# raise next in row
subprocess.Popen(["wmctrl", "-ia", next_win])
如何使用
脚本需要控制端
sudo apt-get install wmctrl
将脚本复制到一个空文件中,另存为
cyclewins.py
将脚本添加到快捷键:选择:系统设置 > “键盘” > “快捷键” > “自定义快捷键”。点击“+”并添加命令:
python3 /path/to/cyclewins.py
就是这样
仅在当前视口上循环浏览窗口?
如果您只想在当前视口上循环浏览窗口,则使用带有参数的脚本oncurrent
:
python3 /path/to/cyclewins.py oncurrent
向后循环?
如果你想从右向左循环,请使用以下参数运行脚本backward
:
python3 /path/to/cyclewins.py backward
当然,这两种论点的结合是可能的;
python3 /path/to/cyclewins.py backward oncurrent
将在当前视口中向后循环显示您的窗口。
答案2
我制造了一个解决方法这也是基于得票最多的答案中的 Python 脚本。但是,要按任务管理器对窗口进行排序,您必须将任务管理器的顺序与其对齐。详细信息请参阅自述文件。