有没有办法让 docky 仅在一个工作区中可用,而不在 Ubuntu 14.04 中的任何其他工作区中可用。
答案1
使 docky 在特定工作区上运行(或不运行)的后台脚本
基于与这个答案,位于启动/停止启动器的后台脚本下方Docky
,具体取决于当前工作区。
该机制本身已经经过了充分测试。话虽如此,在链接的问题中,它通过设置进行测试不同的 Unity Launcher和设置不同的壁纸每个工作区,而不是启动/停止Docky
。然而,这应该没有任何区别,在我测试它的几个小时里,它运行时没有出现任何错误。
如何使用
该脚本需要
wmctrl
:sudo apt-get install wmctrl
将以下脚本复制到一个空文件中,并将其另存为
docky_perworkspace.py
测试运行脚本:
- 开始
Docky
使用以下命令启动脚本:
python3 /path/to/docky_perworkspace.py
现在 Docky 可以在所有工作区上运行。导航到您要不想要
Docky
出现并运行(在工作区中):pkill docky
注意:使用时
pkill docky
,不要从其自己的菜单中关闭 docky!- 开始
- 差不多就是这样了。如果你想改变设置,只需在你想让它运行或不运行的工作区上启动或终止 docky 即可;脚本会记住你的偏好。
如果一切正常,请将其添加到您的启动应用程序中:Dash>启动应用程序>添加命令:
/bin/bash -c "sleep 15&&python3 /path/to/docky_perworkspace.py"
剧本
#!/usr/bin/env python3
import subprocess
import os
import time
datadir = os.environ["HOME"]+"/.config/docky_run"
if not os.path.exists(datadir):
os.makedirs(datadir)
workspace_data = datadir+"/docky_set_"
def get_runs():
try:
subprocess.check_output(["pgrep", "docky"]).decode("utf-8")
return True
except:
return False
def get_res():
# get resolution
xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
pos = xr.index("current")
return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
def current():
# get the current viewport
res = get_res()
vp_data = subprocess.check_output(
["wmctrl", "-d"]
).decode("utf-8").split()
dt = [int(n) for n in vp_data[3].split("x")]
cols = int(dt[0]/res[0])
curr_vpdata = [int(n) for n in vp_data[5].split(",")]
curr_col = int(curr_vpdata[0]/res[0])+1
curr_row = int(curr_vpdata[1]/res[1])
return str(curr_col+curr_row*cols)
curr_ws1 = current()
runs1 = get_runs()
while True:
time.sleep(1)
runs2 = get_runs()
curr_ws2 = current()
datafile = workspace_data+curr_ws2
if curr_ws2 == curr_ws1:
if runs2 != runs1:
open(datafile, "wt").write(str(runs2))
else:
if not os.path.exists(datafile):
open(datafile, "wt").write(str(runs2))
else:
curr_set = eval(open(datafile).read())
if all([curr_set == True, runs2 == False]):
subprocess.Popen(["docky"])
elif all([curr_set == False, runs2 == True]):
subprocess.Popen(["pkill", "docky"])
curr_ws1 = curr_ws2
runs1 = get_runs()
解释
该脚本会跟踪当前工作区(无论您有多少个工作区)。每个工作区都会在 中创建一个文件/.config/docky_run
,其中会“写入” docky 是否应出现在引用工作区(True
或False
)中
如果您停留在同一个工作区,但 docky 已启动或已终止(出现pid
或结束),则脚本会“理解”是您在引用的工作区上进行了更改,并且文件会被更新。
如果工作区然而,如果文件发生变化,脚本将根据文件内容和当前情况查看文件是否存在,然后读取文件并启动或终止 docky(如果没有必要,则不执行任何操作)。如果文件尚不存在(因为这是自首次启动脚本以来您第一次使用工作区),则会创建文件并将其设置为当前(最后)情况。
因为每个工作区的设置都保存在文件中,所以即使重新启动后也会被记住。