![如何自动跳转到新打开的应用程序的视口?](https://linux22.com/image/976771/%E5%A6%82%E4%BD%95%E8%87%AA%E5%8A%A8%E8%B7%B3%E8%BD%AC%E5%88%B0%E6%96%B0%E6%89%93%E5%BC%80%E7%9A%84%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%9A%84%E8%A7%86%E5%8F%A3%EF%BC%9F.png)
我最近发现了 Compiz 的神奇之处,现在我已将其设置为在不同的工作区中打开多个应用程序。我的问题是,如何让工作区切换器在我打开应用程序后自动跳转到应用程序的工作区?
例如,我在工作区 2-1 中打开文件管理器,单击电影文件,这将在工作区 1-2 中打开 VLC。如何让工作区导航器自动切换到工作区 1-2 中的 VLC?
答案1
下面的脚本将改变当前视口为任何出现新窗口。
脚本没有添加任何给您的系统带来明显/可测量的负担(使用系统监视器)。
#!/usr/bin/env python3
import subprocess
import time
def get_wlist():
# get the output of wmctrl -lG, try because wmctrl is a bit buggy :)
try:
return subprocess.check_output(["wmctrl", "-lG"]).decode("utf-8").strip()
except subprocess.CalledProcessError:
pass
def get_wids(currlist):
# get the window ids
return [l.split()[0] for l in currlist.splitlines()]
def get_abspos():
posdate = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
return [int(n) for n in posdate[5].split(",")]
while True:
# wait until the desktop is ready to run wmctrl
wdata1 = get_wlist()
if wdata1:
break
time.sleep(1)
# and then...
wlist1 = get_wids(wdata1)
while True:
time.sleep(2)
wdata2 = get_wlist()
if wdata2:
wlist2 = get_wids(wdata2)
new = [w for w in wlist2 if not w in wlist1]
for item in new:
line = wdata2.splitlines()[wlist2.index(item)].split()
pos = [int(line[n]) for n in [2, 3]]
absposcount = get_abspos()
abspos = [str(pos[0]+absposcount[0]), str(pos[1]+absposcount[1])]
# print(abspos)
subprocess.Popen(["wmctrl", "-o", ",".join(abspos)])
wlist1 = wlist2; wdata1 = wdata2
如何使用
该脚本需要
wmctrl
:sudo apt-get install wmctrl
将脚本复制到一个空文件中,另存为
move_toviewport.py
通过命令运行:
python3 /path/to/move_toviewport.py
如果一切正常,请添加到启动应用程序:Dash > 启动应用程序 > 添加。添加上述命令。
怎么运行的
- 该脚本密切关注可能新出现的窗口,使用
wmctrl -lG
- 如果有新窗口,脚本将读取其在跨越工作区上的(绝对)位置,然后使用
wmctrl -o x,y