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


20

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

  • 工作区1 –致力于科学和数学应用
  • 工作区2 –专用于音乐工具
  • 工作区3 –用于电子电路和仿真
  • 工作区4 –用于Web浏览和通用计算

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

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


您是说每个工作区都有不同的启动器图标集?美味,我喜欢,但是如果您的意思是,我必须跑,明天再努力。请告诉我。
Jacob Vlijm

是的,就是雅各布。有一些用于电路仿真的特定工具(如LTspice)与音乐无关。
丹尼斯J

可以毫无疑问地做到。大概明天或星期天:)。
Jacob Vlijm

谢谢雅各。刚开始这一天,所以我会尝试一下。这听起来完全符合我的要求!!!我会深入研究并报告。
丹尼斯J

雅各布,我还没有开始。在开始之前,我想制作一个备用映像。我不确定系统设置中的备份是否会还原整个分区。一直在研究Clonezilla,它看起来像是创建/还原图像的好工具。这样,如果出现问题,我可以在搞砸之前先找回。本周有一个新的1TB驱动器在路上。我将需要使用Clonezilla将系统移至其中。这些脚本看起来像我可以遵循的,一旦我开始,我将立即向他们报告。感谢您的跟进,我敢打赌其他人也会感谢您所做的。
丹尼斯J

Answers:


24

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


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

不管您有多少个工作区,以下解决方案都可以使每个工作区轻松拥有一组不同的启动器图标。

该设置包括两个部分:

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

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

怎么运行的

涉及两个小脚本:

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

第二脚本保持对什么是当前工作区的眼睛。如果工作空间发生变化,脚本将查看是否存在相应的(启动器)数据文件(由第一个脚本创建)。如果是这样,它将读取该文件并按照文件中所记住的那样更改Unity Launcher。

而已。

如何设定

  1. 该脚本需要wmctrl安装:

    sudo apt-get install wmctrl
    
  2. 创建一个目录,两个脚本都将存储在该目录中。将两个脚本保存在一个目录中非常重要,因为它们共享功能,并且一个从另一个导入。出于相同的原因,重要的是准确命名它们,如下所示。

  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使其可见(.默认情况下,以a开头的文件是不可见的)。

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

  6. 您实际上已经完成了。使用以下命令测试运行后台脚本(在终端窗口中,使其保持运行状态):

    python3 /path/to/launcher_perworkspace.py
    

    如果一切正常,并且启动器按工作区切换,则将以下命令添加到启动应用程序:Dash>启动应用程序>添加:

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

笔记

  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

这将创建一个文件~/launcher_output,其中包含用于将Unity Launcher恢复到初始状态的完整命令。紧急情况下,只需复制文件内容并将其粘贴到终端中即可。

但是同样,除非您手动更改脚本,否则您真的不太可能搞乱启动器。


重要编辑(2)

根据注释的要求,特此运行一个版本,而无需使用任何快捷键组合;只需运行脚本并开始在特定的工作区上设置启动器。该脚本将在您的主目录中创建(不可见)文件,以记住在不同工作区上的(Unity-)启动器集。

我在脚本的“版本1”中尝试了此操作,但始终“嵌入”两个工作空间检查之间的两个启动程序检查,是防止在工作空间中快速移动时防止不良行为(保存错误数据)的窍门。

如何使用

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

    须藤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,因为通常这种情况会不时更新。

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


不使用键盘快捷键就可以吗?我的可视化如下所示:在工作区一个中,仅显示一组图标;在工作区中,仅显示一组图标。当我切换到第二个工作区时,启动器是空的,除了破折号和废纸icons图标-然后我添加了我想要的图标,这些图标会自动保存。对其他工作区重复上述步骤。也许您甚至可以为其创建一个GUI-如果使它工作,它将给您+500。GUI是可选的。
Parto'Apr

1
@Parto WOW,您知道如何吸引别人的注意的:)可以肯定的是,但是要花很多时间才能使其平稳运行(在“单声道”跟踪脚本中进行了尝试)。期望在未来几天内得到答案:)。
Jacob Vlijm

1
太棒了 我将等待...尽管有一个很好的问题,想知道我是怎么想到的。
Parto'Apr

1
@Parto我必须说,您的慷慨给我留下了深刻的印象。我正计划在此基础上做进一步的工作,并可能创建一个ppa,包括用于启动/停止,首选项等的GUI。感谢您的推动!顺便说一句,您的桌面看起来很棒!
Jacob Vlijm 2015年

1
任何时间。每个人都不时需要推动。此外,您之前也曾经帮助过我-只是感谢您。关于这个“项目”,ppa会很好,因为不是每个人都有技巧。
2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.