如何在每个工作区上获得具有不同图标的不同 Unity Launcher?

Den*_*s J 20 icons unity workspaces launcher viewports

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

  • 工作区 1 – 专用于科学和数学应用程序
  • 工作区 2 –​​ 专用于音乐工具
  • 工作区 3 – 用于电子电路和模拟
  • 工作区 4 – 用于网页浏览和一般计算

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

如何做到这一点一定很明显,但我找不到答案。我在 Ubuntu 上已经 4 天了,所以请不要以为我知道我在做什么!

Jac*_*ijm 24

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


1. 在此处输入图片说明 2. 在此处输入图片说明 3. 在此处输入图片说明 4. 在此处输入图片说明

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

设置包括两部分:

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

  2. 在后台运行的脚本,跟踪当前工作区是什么并设置相应的 Unity Launcher。每当用户切换工作区时,它就会起作用。

这个怎么运作

涉及两个小脚本:

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

第二脚本保持对什么是当前工作区的眼睛。如果有工作区更改,脚本会查看相应的(启动程序)数据文件是否存在(由第一个脚本创建)。如果是这样,它会读取文件并更改 Unity Launcher,如文件中所记。

就是这样。

如何设置

  1. 需要wmctrl安装脚本:

    sudo apt-get install wmctrl
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个目录,在其中存储两个脚本。将两个脚本一起保存在一个目录中很重要,因为它们共享功能并且一个从另一个导入。出于同样的原因,完全按照下面的指示命名它们很重要。

  3. 将下面的每个脚本复制到一个(不同的)空文件中,将它们保存到目录中(在 中创建2.),完全命名为:

    set_workspace.py

    sudo apt-get install wmctrl
    
    Run Code Online (Sandbox Code Playgroud)

    launcher_perworkspace.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()
    
    Run Code Online (Sandbox Code Playgroud)
  4. 将第一个脚本 ( set_workspace.py)添加到您选择的快捷键组合:系统设置 > “键盘” > “快捷方式” > “自定义快捷方式”。单击“+”并添加命令:

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

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

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

    python3 /path/to/launcher_perworkspace.py
    
    Run Code Online (Sandbox Code Playgroud)

    如果一切正常,并且您的启动器在每个工作区切换,请将以下命令添加到您的启动应用程序:Dash > 启动应用程序 > 添加:

    /bin/bash -c "sleep 15&&python3 /path/to/launcher_perworkspace.py"
    
    Run Code Online (Sandbox Code Playgroud)

笔记

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

编辑

从您的评论中,我了解到您不确定是否运行脚本,并且您担心会弄乱您当前的启动器。

我很确定这对脚本所做的事情的尊重太多(或太少:))。但是,您可以使用以下命令简单地备份您当前的 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
Run Code Online (Sandbox Code Playgroud)

这将创建一个文件~/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
    
    Run Code Online (Sandbox Code Playgroud)
  4. 如果它按预期工作,请将以下命令添加到您的启动应用程序:

    /bin/bash -c "sleep 15&&python3 /path/to/launcher_toworkspace.py"
    
    Run Code Online (Sandbox Code Playgroud)

剧本

#!/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
Run Code Online (Sandbox Code Playgroud)

笔记

如果您使用先前版本的脚本设置您的工作区,它们也应该适用于此版本。

购电协议

根据 2015-04-23,Dennis J 的好问题和 Parto 的鼓励导致ppa为脚本创建了一个,覆盖在 webupd8 上,包括一个 GUI 来管理它。

ppa:vlijm/lswitcher
Run Code Online (Sandbox Code Playgroud)

要安装它,请运行:

sudo add-apt-repository ppa:vlijm/lswitcher
sudo apt-get update
sudo apt-get install lswitcher
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

从现在开始,它被打包为 Trusty & Utopic。我会在测试后添加其他人。我还将添加一个.deb安装程序,但我建议使用ppa,因为通常这种东西会时不时更新。

由于视口数据的位置已从 更改~/~/.config/lswitcher,如果您使用以前的脚本,则必须再次设置 Unity Launcher。