为每个工作区设置一个不同的Unity Launcher:
1. 2. 3. 4。
不管您有多少个工作区,以下解决方案都可以使每个工作区轻松拥有一组不同的启动器图标。
该设置包括两个部分:
(一个)快捷键组合,用于“记住”当前工作空间的启动器图标集。
在后台运行的脚本,跟踪当前的工作空间并设置相应的Unity Launcher。只要用户切换工作空间,它就会起作用。
怎么运行的
涉及两个小脚本:
第一个脚本做了一件简单的事情:将当前启动器的内容写入到主目录中的(隐藏)文件中,该文件以当前工作空间命名(编号)。
在第二脚本保持对什么是当前工作区的眼睛。如果工作空间发生变化,脚本将查看是否存在相应的(启动器)数据文件(由第一个脚本创建)。如果是这样,它将读取该文件并按照文件中所记住的那样更改Unity Launcher。
而已。
如何设定
该脚本需要wmctrl
安装:
sudo apt-get install wmctrl
创建一个目录,两个脚本都将存储在该目录中。将两个脚本保存在一个目录中非常重要,因为它们共享功能,并且一个从另一个导入。出于相同的原因,重要的是准确命名它们,如下所示。
将下面的每个脚本复制到一个(不同的)空文件中,并将它们保存到目录中(在中创建2.
),其精确命名为:
set_workspace.py
#!/usr/bin/env python3
import subprocess
import os
workspace_data = os.environ["HOME"]+"/.launcher_data_"
key = ["gsettings get ", "gsettings set ", "com.canonical.Unity.Launcher favorites"]
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)
def remember_current():
currlauncher = subprocess.check_output(["/bin/bash", "-c", key[0]+key[2]]).decode("utf-8").strip()
f = workspace_data+current()
open(f, "w").write(currlauncher)
if __name__ == "__main__":
remember_current()
launcher_perworkspace.py
#!/usr/bin/env python3
import subprocess
import set_workspace
import time
workspace_data = set_workspace.workspace_data
key = set_workspace.key
def check_datafile(desktop):
f = workspace_data+str(desktop)
try:
new_launcher = open(f).read()
command = key[1]+key[2]+' "'+str(new_launcher)+'"'
subprocess.Popen(["/bin/bash", "-c", command])
except FileNotFoundError:
pass
curr_dt1 = set_workspace.current()
check_datafile(curr_dt1)
while True:
time.sleep(1)
curr_dt2 = set_workspace.current()
if curr_dt2 != curr_dt1:
check_datafile(curr_dt2)
curr_dt1 = curr_dt2
将第一个脚本(set_workspace.py
)添加到您选择的快捷键组合中:系统设置>“键盘”>“快捷方式”>“自定义快捷方式”。单击“ +”并添加命令:
python3 /path/to/set_workspace.py
运行组合键,查看是否.launcher_data_3
在您的主目录中创建了一个文件,如:。您可能需要按Ctrl+ H使其可见(.
默认情况下,以a开头的文件是不可见的)。
浏览工作空间并重复该过程:设置启动器图标的组合,然后按组合键以“记住”该特定工作空间的设置。
您实际上已经完成了。使用以下命令测试运行后台脚本(在终端窗口中,使其保持运行状态):
python3 /path/to/launcher_perworkspace.py
如果一切正常,并且启动器按工作区切换,则将以下命令添加到启动应用程序:Dash>启动应用程序>添加:
/bin/bash -c "sleep 15&&python3 /path/to/launcher_perworkspace.py"
笔记
- 如果要更改特定工作区的启动器图标集,只需导航至工作区,根据需要添加/删除图标,然后按组合键即可(无需重新启动后台脚本)。
- 从评论中,我感觉到在记住当前工作空间的当前启动器的快捷方式上存在一些误解。您只需要一个键盘快捷键即可为当前工作空间“保存”当前启动器。无论您在什么工作空间上,它都将完全相同地工作。该脚本本身将决定什么是当前的工作空间。
编辑
根据您的评论,我了解到您不确定要运行脚本,还是担心会弄乱当前的启动器。
我很确定这对脚本的作用是太多(或太少:)。但是,您可以使用以下命令简单地备份当前的Unity Launcher:
printf 'gsettings set com.canonical.Unity.Launcher favorites "' > ~/launcher_output&&printf "$(gsettings get com.canonical.Unity.Launcher favorites)">>~/launcher_output&&printf '"'>>~/launcher_output
这将创建一个文件~/launcher_output
,其中包含用于将Unity Launcher恢复到初始状态的完整命令。紧急情况下,只需复制文件内容并将其粘贴到终端中即可。
但是同样,除非您手动更改脚本,否则您真的不太可能搞乱启动器。
重要编辑(2)
根据注释的要求,特此运行一个版本,而无需使用任何快捷键组合;只需运行脚本并开始在特定的工作区上设置启动器。该脚本将在您的主目录中创建(不可见)文件,以记住在不同工作区上的(Unity-)启动器集。
我在脚本的“版本1”中尝试了此操作,但始终“嵌入”两个工作空间检查之间的两个启动程序检查,是防止在工作空间中快速移动时防止不良行为(保存错误数据)的窍门。
如何使用
与第一个版本一样,此脚本使用wmctrl
:
须藤apt-get install wmctrl
将脚本复制到一个空文件中,另存为 launcher_toworkspace.py
使用以下命令运行它:
python3 /path/to/launcher_toworkspace.py
如果它按预期工作,则将以下命令添加到“启动应用程序”:
/bin/bash -c "sleep 15&&python3 /path/to/launcher_toworkspace.py"
剧本
#!/usr/bin/env python3
import subprocess
import os
import time
datadir = os.environ["HOME"]+"/.config/lswitcher"
if not os.path.exists(datadir):
os.makedirs(datadir)
workspace_data = datadir+"/launcher_data_"
key = [
"gsettings get ",
"gsettings set ",
"com.canonical.Unity.Launcher favorites",
]
def get_launcher():
return subprocess.check_output(
["/bin/bash", "-c", key[0]+key[2]]
).decode("utf-8").strip()
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()
currlauncher1 = get_launcher()
while True:
time.sleep(1)
currlauncher2 = get_launcher()
curr_ws2 = current()
datafile = workspace_data+curr_ws2
if curr_ws2 == curr_ws1:
if currlauncher2 != currlauncher1:
open(datafile, "wt").write(currlauncher2)
else:
if not os.path.exists(datafile):
open(datafile, "wt").write(currlauncher2)
else:
curr_set = open(datafile).read()
command = key[1]+key[2]+' "'+str(curr_set)+'"'
subprocess.Popen(["/bin/bash", "-c", command])
curr_ws1 = curr_ws2
currlauncher1 = get_launcher()
注意
如果使用脚本的先前版本设置工作空间,则它们也应适用于该版本。
PPA
根据2015-04-23,Dennis J的一个很好的问题以及Parto的鼓励,导致在webupd8上创建了一个ppa
用于脚本的脚本,包括用于管理该脚本的GUI。
ppa:vlijm/lswitcher
要安装它,请运行:
sudo add-apt-repository ppa:vlijm/lswitcher
sudo apt-get update
sudo apt-get install lswitcher
从现在开始,它被打包用于Trusty&Utopic。我将在测试后添加其他人。我还将添加一个.deb
安装程序,但我建议使用ppa
,因为通常这种情况会不时更新。
由于视口数据的位置已从更改~/
为~/.config/lswitcher
,因此如果您使用的是先前的脚本,则必须再次设置Unity Launcher。