每个工作区都有自己的启动器和文件夹

每个工作区都有自己的启动器和文件夹

我在 compiz 上配置了 4 个工作区。我想知道是否有办法让文件夹独占在主桌面 (1) 中?我想让其他工作区清晰可见,以便查看壁纸。

Ubuntu 14.04 x64

答案1

此答案是这个答案,但不同之处在于这个是用于 Unity(而不是 XFCE)并且用于管理一组(链接至)文件夹每个工作区,而不是应用程序启动器。但是,通过取消注释一行(请参阅下文),您还可以同时为每个工作区设置一组不同的应用程序启动器。

事实上,它是为 Unity 设计的,这让脚本稍微复杂一些,但从原理上讲,它的工作原理几乎完全相同。

一个例子:

工作区 1:

在此处输入图片描述

工作区 2 (3, 4):

在此处输入图片描述

如何以工作区特定的方式提供文件夹

在下面的解决方案中,实际的文件夹不会出现在您的桌​​面上(或仅在其中一个工作区中,或您选择的任何工作区中),但是链接到(任何)文件夹。从您的评论中我了解到这是您可以接受的解决方案。
这使得它有效地有可能一个工作区上有 (虚拟) 文件夹,而另一个工作区上没有。后台脚本会跟踪当前工作区并根据您的设置更改桌面上的链接集。

如何设置

  1. 该脚本用于wmctrl获取当前工作区的信息:

    sudo apt-get install wmctrl
    
  2. 在您的主目录中(不是在子目录中,而是在“第一”级),创建一个目录(确切地)名为:

    desktop_data
    

    在此目录中,为您的每个桌面(本例中为四个)创建一个名为(确切地说)的文件夹:

    desktop_1
    desktop_2
    desktop_3
    desktop_4
    

    在此处输入图片描述

  3. 在这些文件夹中,创建指向您想要显示在相应桌面上的所有文件夹的链接。例如,如果您希望文件夹Documents显示在视口(工作区)1 上,请创建一个链接:

    ln -s ~/Documents ~/desktop_data/desktop_1/Documents
    

    依此类推,对于您想要出现在目标桌面上的所有文件夹:

    在此处输入图片描述

    注意:如果您还希望每个桌面有一组启动器,请将启动器添加到文件夹并使其可执行(!)。

  4. 将以下脚本复制到一个空文件中,并将其另存为change_desktop.py。通过在终端窗口中运行以下命令来测试运行它:

    python3 /path/to/change_desktop.py
    

    像以前一样切换工作区,因为脚本可以执行切换工作区的操作。

    注意:如果您还想要一组特定于不同工作区的启动器,请取消注释该行:

    if os.path.islink(subject) or subject.endswith(".desktop"):
    

    确保以下行:

    # if os.path.islink(subject):
    

    被注释掉(#在行首放置一个)

在上面的例子中,文件夹DocumentsNetwerkmapscreen_notes出现在工作区 1 中,但没有出现在工作区 2 中(3,4)

如果一切正常,请将其添加到启动应用程序中:Dash > 启动应用程序 > 添加

剧本

#!/usr/bin/env python3
import subprocess
import os
import time
import shutil

home = os.environ["HOME"]
desktop_dir = home+"/"+"Bureaublad"
data_dirstr = home+"/desktop_data/desktop_"

get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")

# get resolution
xr = get("xrandr").split()
plus = 2 if xr[xr.index("connected")+1] == "primary" else 1
res = [int(n) for n in xr[xr.index("connected")+plus].split("+")[0].split("x")]

def get_dt():
    # get the current viewport
    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_dt1 = get_dt()

while True:
    time.sleep(1)
    curr_dt2 = get_dt()
    # alter the set of links when workspace changes
    if not curr_dt1 == curr_dt2:
        datafolder = data_dirstr+curr_dt2
        for f in os.listdir(desktop_dir):
            subject = desktop_dir+"/"+f
            # uncomment one of the two lines below
            if os.path.islink(subject):                                       # uncomment for only folders (links to) per workspace
            # if os.path.islink(subject) or subject.endswith(".desktop") :    # uncomment for folders and .desktop files per workspace
            #
                os.remove(subject)
        for f in os.listdir(datafolder):
            subject = datafolder+"/"+f; target = desktop_dir+"/"+f
            if os.path.islink(subject):
                os.symlink(os.readlink(subject), target)
            else:
                shutil.copy(subject,target)
    curr_dt1 = curr_dt2

简要说明

如果脚本启动,它会检查屏幕的分辨率。然后每秒检查一次当前工作区,并查看是否有工作区转变。如果是,它会将您放置在相应文件夹中的链接复制~/desktop_data到您的桌面,并删除不存在的链接。

重要的提示

在您的本地化 Ubuntu 版本中,Desktop名称可能会有所不同(例如荷兰语中的“Bureaublad”)。如果是这样,请在脚本中更改以下行:

desktop_dir = home+"/"+"Desktop" 

以反映文件夹的本地化名称Desktop

答案2

抱歉,目前不支持此功能。您可以尝试使用第三方软件,例如屏幕片段但我强烈不推荐它。

相关内容