現在、4つのワークスペース(「メイン」、「ゲーム」、「作業」、「オーバーフロー」)があります。完全なセットアップでは、「ゲーム」ワークスペースには、Steamおよび個々のゲームのショートカット(デスクトップまたはパネルのいずれか)があります。
「仕事」に切り替えると、ゲームに関連するものは何もありませんが、代わりに、Google Docsリンクや仕事関連のすべてのファイルへのショートカットなどがあります。
Xfce4で独自にカスタマイズされたワークスペースは可能ですか?
デスクトップごとにランチャーの異なるセットを持つようにセットアップを制限しても、それほど複雑ではありません。必要なのは、現在のワークスペースを追跡し、それに応じてランチャーのセットを自動的に変更するために、バックグラウンドで実行されるスクリプトです。
4つのワークスペースがあり、次のランチャーを異なるワークスペースで使用できるようにしたいとします。
ワークスペース1>ワークスペース2>ワークスペース3>ワークスペース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」でない場合は、次の行で変更します。
desktop_dir = home+"/"+"Desktop"
スクリプトに数行を追加すると、ワークスペースごとの設定オプションは、ディレクトリへのリンクの変更セットで拡張できます:
1つのワークスペースに、たとえばDocumentsフォルダーへのリンクと、Officeアプリケーションのランチャーとの組み合わせ:
別のワークスペースには、Picturesフォルダーへのリンクがあり、画像エディターのランチャーと結合されています。
セットアップはオプション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)
他のデスクトップ環境(KDEなど)はこれをネイティブに提供しますが、これはXFCEで部分的にのみサポートされています。
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はパネルに番号を付けます。これは、ローカルにしたい最初のパネルの番号です。ここでは、最初のパネルはグローバルに保たれ、パネル2以降は独自のワークスペースに対してローカルになります。$count
:ローカルにするパネルの数。デフォルトでは、これはワークスペースの数に等しくなります。ワークスペースごとに1つの異なるローカルパネル。$desk
:ローカルパネルを持つ最初のワークスペース。デフォルトでは、すべてのワークスペースにローカルパネルがありますが、この変数をより高い値に設定すると、必要に応じて最初のいくつかのワークスペースにローカルパネルを設定できなくなります。セッション開始時にこのスクリプトを自動的に開始するようにXFCEを構成します:XFCE Settings Manager> Session and Startupに移動し、Application Autostartタブをクリックします。次に、Addボタンで、各セッションを開くたびにスクリプトの実行をスケジュールします。