如何在每个工作区上使用不同的图标来获得不同的Unity Launcher?

我通过使用Screenlets,devilspie或CCSM来阅读每个工作区中单独的桌面文件夹的各种答案……但这不是我的问题的答案。 我几天前安装了14.04 LTS,并且取得了很好的成功,我的大部分应用程序和一些新的应用程序都可以运行。 我想要的是拥有4个独立的工作空间,每个工作空间都有一些不同的图标用于我运行的环境。 例如,

  • 工作区1 – 致力于科学和数学应用程序
  • Workspace 2 – 致力于音乐工具
  • 工作区3 – 用于电子电路和模拟
  • 工作区4 – 用于Web浏览和通用计算

想想Android平板电脑,每个屏幕可以包含单独的图标。

必须明白如何做到这一点,但我找不到答案。 我在Ubuntu上4天了,所以请不要认为我知道我在做什么!

为每个工作区设置不同的Unity Launcher:

1。 在此处输入图像描述 2。 在此处输入图像描述 3。 在此处输入图像描述 4。 在此处输入图像描述

无论您拥有多少工作空间,下面的解决方案都可以轻松地为每个工作区设置一组不同的启动器图标。

该设置包括两部分:

  1. (一个)快捷键组合,用于“记住”当前工作空间的启动器图标集。

  2. 一个在后台运行的脚本,跟踪当前工作区的内容并设置相应的Unity Launcher。 只要用户切换工作区,它就会起作用

这个怎么运作

涉及两个小脚本:

一个脚本做了一件简单的事情:它将当前启动器的内容写入主目录中的(隐藏)文件,在当前工作空间之后命名(编号)。

第二个脚本会关注当前工作空间。 如果存在工作空间更改 ,脚本将查看是否存在相应的(启动器)数据文件(由第一个脚本创建)。 如果是这样,它会读取文件并改变Unity Launcher,就像在文件中记住的那样。

而已。

如何设置

  1. 该脚本需要安装wmctrl

     sudo apt-get install wmctrl 
  2. 创建一个存储两个脚本的目录。 重要的是两个脚本在一个目录中保存在一起,因为它们共享function,一个脚本从另一个目录导入。 出于同样的原因,您必须完全按照下面的说明命名它们。

  3. 将下面的每个脚本复制到(不同的)空文件中,将它们保存到目录(在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 
  4. 将第一个脚本( set_workspace.py )添加到您选择的快捷键组合中:系统设置>“键盘”>“快捷方式”>“自定义快捷方式”。 单击“+”并添加命令:

     python3 /path/to/set_workspace.py 
  5. 运行组合键,查看是否在主目录中创建了一个文件,如: .launcher_data_3 。 您可能需要按Ctrl + H才能使文件可见(默认情况下,以.开头的文件是不可见的)。

    浏览工作区并重复此过程:设置启动器图标的组合,然后按下组合键以“记住”该特定工作区的集合。

  6. 你现在几乎完成了。 使用命令测试后台脚本(从终端窗口运行,保持运行):

     python3 /path/to/launcher_perworkspace.py 

    如果一切正常,并且每个工作区都启动了启动器,请将以下命令添加到启动应用程序:Dash> Startup Applications> Add:

     /bin/bash -c "sleep 15&&python3 /path/to/launcher_perworkspace.py" 

笔记

  1. 如果要更改特定工作区的启动器图标集,只需导航到工作区,根据需要添加/删除图标并按下组合键(无需重新启动后台脚本)。
  2. 从评论中我感觉到对于记住当前工作区的当前Launcher的快捷方式存在一些误解。 您只需要一个键盘快捷键来“保存”当前工作区的当前启动器。 无论您在哪个工作区,它都将完全相同。 脚本本身将确定当前工作空间什么。

编辑

从你的评论中,我知道你不确定要运行脚本,你担心你会搞乱你当前的发射器。

我很确定太多(或太少:) :)尊重脚本正在做什么。 但是,您只需使用以下命令备份当前的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”中尝试了这一点,但总是在两个工作区检查之间“嵌入”两个启动器检查,结果是在快速移动工作区时防止不需要的行为(保存不正确的数据)的技巧。

如何使用

  1. 与第一个版本一样,此脚本使用wmctrl

    sudo apt-get install wmctrl

  2. 将脚本复制到空文件中,将其另存为launcher_toworkspace.py

  3. 使用以下命令运行它:

     python3 /path/to/launcher_toworkspace.py 
  4. 如果它按预期工作,请将以下命令添加到启动应用程序:

     /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 ,因为通常这种事情会ppa更新。

由于视口数据的位置已从~/更改为~/.config/lswitcher ,因此如果使用上一个脚本,则必须再次设置Unity Launcher。