我可以以不同的方式设置我的xfce工作区吗?

我目前有四个工作区('Main','Game','Work','Overflow')。在完美的设置中,'Game'工作区应该有Steam和各个游戏的快捷方式(无论是在桌面上还是在面板上)。
切换到'Work'时,不应该有任何与游戏相关的内容,而是应该有像Google Docs链接和所有与工作相关的文件的快捷方式。
在xfce4中是否可以实现独特定制的工作区?

关于附加的“14.04”标签:只有在您的问题与特定版本相关时才使用此标签。我的问题是否与14.04有关?@sylvain - muad-dweeb
不,这与我所了解的任何工作空间概念都不符。但是我又算什么呢...也许你应该与xfce社区联系,并将其列入愿望清单:https://wiki.xfce.org/wish_list - mondjunge
@SCK:由于您在14.04上遇到了这个问题,使用标签可以帮助诊断该问题。这可能会影响其他版本,但是拥有这些信息可以复现问题是很有帮助的。 - Sylvain Pineau
那是一个庞大的清单。@mondjunge对我来说,很奇怪的是有这么多人只是要求每个工作区都有独特的壁纸,但似乎没有人谈论独特的启动器和快捷方式集合。 - muad-dweeb
@SCK:是的,对我来说也很奇怪,但大多数人在他们的电脑上只做一件事情(除了浏览虚假新闻和推特),所以没有必要。 - mondjunge
更换桌面启动器是否是一个可接受的选择? - Jacob Vlijm
@JacobVlijm :请原谅我的愚蠢,但是当你说“starters”时,你是指应用程序启动器和快捷方式吗?我也可以尝试其他桌面环境,看看是否有更适合的选择,但我真的很喜欢xfce4。我只是认为每个人的个人电脑应该完全符合他们的需求,以实现最佳的工作流程和用户体验,甚至到最微小的细节。 - muad-dweeb
可以做的是在每个工作区的桌面上放置一组应用程序启动器(和链接),但这将是一个相当大的操作。此外,引用图标的对齐将有点巧合(除非我们把它变成一个真正的大项目:))。一个后台脚本将根据当前工作区修改桌面图标,并根据用户所做的更改更新集合。我之前就在做类似的事情,但这是一项相当大的工作。不过很有趣。恐怕在所有Ubuntu变体中,所有工作区/视口都只有一个桌面。 - Jacob Vlijm
@JacobVlijm:明白了,谢谢你的见解。我之前并没有意识到这是一个如此庞大的工作,因为我对这类事情背后的编程知识几乎一无所知。嗯,不要因为我的吹毛求疵而影响你的睡眠,我可以接受xfce的现状;对于我个人的使用来说,它仍然比Unity好得多。 - muad-dweeb
2个回答

如果我们将设置限制为每个桌面有一个不同的启动器集合,那就不是很复杂。我们需要一个在后台运行的脚本来跟踪当前工作区,并根据情况自动更改启动器集合。
1. 每个工作区一个启动器集合
假设我有四个工作区,我希望在不同的工作区上有以下启动器可用:
工作区 1 > 工作区 2 > 工作区 3 > 工作区 4 >

enter image description here enter image description here enter image description here enter image description here

  • 工作区 1:Firefox / 空闲
  • 工作区 2:Gcolor2 / Gimp 图像编辑器 / Inkskape
  • 工作区 3:Abiword / Gnumeric / 邮件阅读器
  • 工作区 4:Mines / Sudoku

设置步骤

脚本使用wmctrl: sudo apt-get install wmctrl
在您的主目录(不是子目录,而是“第一”级别)中创建一个名为desktop_data的目录(确切命名): desktop_data
在此目录中,为每个桌面创建一个名为(确切命名)的文件夹: desktop_1 desktop_2 desktop_3 desktop_4
为您的桌面上的所有应用程序(对于所有工作区)创建启动器,并将它们复制到相应的文件夹中。
将下面的脚本复制到一个空文件中,将其保存为change_launchers.py。通过在终端窗口中运行以下命令来测试运行它: python3 /path/to/change_launchers.py
如果一切正常,请将其添加到启动应用程序中。
脚本如下:
#!/usr/bin/env python3 import subprocess import os import time import shutil
home = os.environ["HOME"] desktop_dir = home+"/"+"Desktop" data_dirstr = home+"/desktop_data/desktop_"
get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_desktop(): return [l for l in get("wmctrl -d").splitlines() if "*" in l][0].split()[-1]
while True: curr_dt1 = get_desktop() time.sleep(1) curr_dt2 = get_desktop() # 当工作区改变时,修改启动器集合 if not curr_dt1 == curr_dt2: datafolder = data_dirstr+curr_dt2 for f in [f for f in os.listdir(desktop_dir)if f.endswith(".desktop")]: subject = desktop_dir+"/"+f os.remove(subject) for f in os.listdir(datafolder): subject = datafolder+"/"+f; target = desktop_dir+"/"+f shutil.copyfile(subject, target) subprocess.call(["/bin/bash", "-c", "chmod +x "+target])

注意

在不同的Ubuntu本地化版本中,“桌面”文件夹的名称可能会有所不同(荷兰语为:“Bureaublad”)。如果在您的Ubuntu版本中,桌面文件夹的名称不是“Desktop”,请在下面的行中进行更改:

desktop_dir = home+"/"+"Desktop"

2. 扩展可能性,启动器和链接
如果我们在脚本中添加几行代码,可以通过一组不同的目录链接来扩展每个工作区的设置选项:
在一个工作区中,我们可以将一个指向“文档”文件夹的链接与办公应用程序的启动器结合起来。

enter image description here

在另一个工作区,我们有一个链接到“图片”文件夹的方式,结合了图像编辑器的启动器。

enter image description here

设置步骤

设置步骤与选项1基本相同,但是另外,在数据文件夹中(参见选项1),创建链接到文件夹的方式(使用ln -s <source> <destination>),以便在相应的工作空间中可用:

enter image description here

The script

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

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

get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_desktop():
    return [l for l in get("wmctrl -d").splitlines() if "*" in l][0].split()[-1]

while True:
    curr_dt1 = get_desktop()
    time.sleep(1)
    curr_dt2 = get_desktop()
    # alter the set of launchers & 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
            if os.path.islink(subject) or subject.endswith(".desktop") :
                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)

嘿 @jacob,对于回复晚了我很抱歉。我现在已经成功地使用脚本(选项1)超过24小时了。它被添加到我的应用程序自启动中,命名为“工作区-重生”。在我的系统上,生成只需要1-2秒钟就能完成。不过有一个重要的细节是,在“desktop_data”目录中的文件夹应该以“desktop_x”的形式命名,其中“x”是当前给定的每个工作区的名称。在我的情况下,这意味着我的文件夹是('desktop_Main','desktop_Game','desktop_Work','desktop_Overflow')。如果没有这个小调整,它对我来说是无法正常工作的 :) - muad-dweeb
"主要" "游戏" "工作" "溢出" <br/> 我喜欢这个!@jacob做得很棒。 - muad-dweeb
太好了!只是好奇你是如何调整的,因为脚本通过工作区的当前编号(wmctrl -l命令输出结果的最后一个字符)来识别文件夹的名称(-name)。你是不是添加了一行代码将名称转换为你使用的那些名称? - Jacob Vlijm
不,我根本没有修改脚本本身。我只是不得不更改目录名称才能让脚本正常运行。我的编程能力非常有限,所以对于为什么需要这样做,我没有任何想法。抱歉:/ - muad-dweeb
不不!根本不需要,我只是坐在那里疑惑不解,因为如果你真的给文件夹起了不同的名字,脚本就不应该工作:)。嗯,如果它能正常运行,我很高兴:)我一定是对上面的文字有什么误解。 - Jacob Vlijm
我刚刚升级到选项2 :D 这将是apt软件源的一项不错的补充。@Jacob 虽然这只是我个人的意见,但我对此非常印象深刻。 - muad-dweeb
1哇,谢谢!我可能会再稍微修改一下,并通过Launchpad(ppa)提供它。 - Jacob Vlijm
感谢wmctrl命令。我依赖它来构建一个不同的解决方案(基于面板,作为单独的答案发布),以避免脚本在无限循环中运行。 - WhiteWinterWolf

一些其他桌面环境(如KDE)本身就提供此功能,但在XFCE中只有部分支持。在XFCE中本地支持的功能包括:您可以在每个工作区设置不同的壁纸,此功能得到充分支持,并且可以通过工作区设置GUI轻松配置;您可以为特定的工作区指定一个面板,但是据我所知,没有GUI选项可用于配置此功能,但下面的脚本将处理所有内容。我采用的解决方案是:为每个工作区创建一个新面板。您还可以创建补充全局面板,这些面板将显示在所有工作区域(例如通知栏之类的某些元素只能添加一次,因此让其在每个工作区域上都可见的唯一方法是将其添加到全局面板)。配置和运行下面的脚本以将每个本地面板分配到其自己的工作区。配置XFCE以在每次启动时运行脚本。按照您的意愿配置面板。与其他答案相反,此脚本不会作为无尽循环运行,每秒获取状态。它仅在会话打开期间运行一次,以将每个本地面板与其自己的工作区关联起来,此后所有其他内容均由窗口管理器本地处理。
#! /bin/sh

# First panel to move
start=2

# Number of panels to move
count=$( wmctrl -d | wc -l )

desk=0
for winid in $( wmctrl -l | grep 'dom0 xfce4-panel$' \
    | awk "NR==$start,NR==$(( start + count - 1 )) { print \$1; }" )
do
    wmctrl -i -r $winid -b remove,sticky
    wmctrl -i -r $winid -t $desk
    desk=$(( desk + 1 ))
done

将此脚本保存在您的主目录中,例如命名为local-panels.sh,并使其可执行(chmod u+x ~/local-panels.sh)。
根据您的需求配置脚本: - $start:XFCE对面板进行编号,这是您想要将其设置为本地的第一个面板的编号。这里保留了第一个面板作为全局面板,而从第二个面板开始,每个面板都会成为其所在工作区的本地面板。 - $count:要设置为本地面板的数量。默认情况下,这与工作区的数量相同,即每个工作区都有一个不同的本地面板。 - $desk:第一个具有本地面板的工作区。默认情况下,每个工作区都会有一个本地面板,但是如果您希望在前几个工作区中没有本地面板,则可以将此变量设置为较高的值。
配置XFCE以在会话打开时自动启动此脚本:进入“XFCE设置管理器”>“会话和启动”,点击“应用程序自动启动”选项卡,然后点击“添加”按钮以安排在每次会话打开时执行该脚本。