我目前有四个工作区(“主”、“游戏”、“工作”、“溢出”)。在完美的设置中,“游戏”工作区将有 Steam 和单个游戏的快捷方式(在桌面或面板中)。
切换到“工作”不应该有任何与游戏相关的内容,而应该有 Google Docs 链接和所有与工作相关的文件的快捷方式。
xfce4 中可以实现独特定制的工作区吗?
答案1
如果我们限制设置有一个不同的发射器每个桌面都不太复杂。我们需要的是一个脚本,在后台运行以跟踪当前工作区并自动更改启动器集。
1. 每个工作区一组启动器
假设我有四个工作区,我希望以下启动器在不同的工作区上可用:
工作区 1 > 工作区 2 > 工作区 3 > 工作区 4 >
- 工作区 1:Firefox/空闲
- 工作区 2:Gcolor2 / Gimp 图像编辑器 / Inkskape
- 工作区 3:Abiword / Gnumeric / 邮件阅读器
- 工作区 4:地雷/数独
如何设置
该脚本使用
wmctrl
:sudo apt-get install wmctrl
在您的主目录中(不是在子目录中,而是在“第一”级),创建一个目录(确切地)名为:
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() # alter the set of launchers when workspace changes 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_dir = home+"/"+"Desktop"
2. 扩展可能性、启动器和链接
如果我们在脚本中添加几行,则可以通过更改一组设置来扩展每个工作区选项的设置目录链接:
在一个工作区中,我们有一个指向文件文件夹,结合办公应用程序的启动器:
在另一个工作区中,我们有一个指向图片文件夹,结合图像编辑器的启动器:
如何设置
设置与选项 1 几乎相同,但此外,在数据文件夹(参见选项 1)中,创建指向ln -s <source> <destination>
您希望在相应工作区上可用的文件夹的链接(使用):
剧本
#!/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)
答案2
一些其他桌面环境(如 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 设置管理器>会话和启动,点击应用程序自动启动选项卡,然后在添加按钮来安排每次会话打开时执行脚本。