web-dev-qa-db-ja.com

xfceワークスペースを異なる方法で設定できますか?

現在、4つのワークスペース(「メイン」、「ゲーム」、「作業」、「オーバーフロー」)があります。完全なセットアップでは、「ゲーム」ワークスペースには、Steamおよび個々のゲームのショートカット(デスクトップまたはパネルのいずれか)があります。

「仕事」に切り替えると、ゲームに関連するものは何もありませんが、代わりに、Google Docsリンクや仕事関連のすべてのファイルへのショートカットなどがあります。

Xfce4で独自にカスタマイズされたワークスペースは可能ですか?

4
SCK

デスクトップごとにランチャーの異なるセットを持つようにセットアップを制限しても、それほど複雑ではありません。必要なのは、現在のワークスペースを追跡し、それに応じてランチャーのセットを自動的に変更するために、バックグラウンドで実行されるスクリプトです。

1.ワークスペースごとのランチャーのセット

4つのワークスペースがあり、次のランチャーを異なるワークスペースで使用できるようにしたいとします。

ワークスペース1>ワークスペース2>ワークスペース3>ワークスペース4>

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

  • ワークスペース1:Firefox /アイドル
  • ワークスペース2:Gcolor2/Gimp Image Editor/Inkskape
  • ワークスペース3:Abiword/Gnumeric/Mail Reader
  • ワークスペース4:鉱山/数独

設定方法

  1. スクリプトはwmctrlを使用します。

    Sudo apt-get install wmctrl
    
  2. ホームディレクトリ(サブディレクトリではなく、「最初の」レベル)に、次の名前の(正確に)ディレクトリを作成します。

    desktop_data
    

    このディレクトリ内に、デスクトップごとに(正確に)という名前のフォルダーを作成します。

    desktop_1
    desktop_2
    desktop_3
    desktop_4
    

    <image5>

  3. デスクトップ上のすべてのアプリケーション(すべてのワークスペース)のランチャーを作成し、対応するフォルダーにコピーします。

  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"

2.可能性、ランチャー、リンクの拡張

スクリプトに数行を追加すると、ワークスペースごとの設定オプションは、ディレクトリへのリンクの変更セットで拡張できます

1つのワークスペースに、たとえばDocumentsフォルダーへのリンクと、Officeアプリケーションのランチャーとの組み合わせ:

enter image description here

別のワークスペースには、Picturesフォルダーへのリンクがあり、画像エディターのランチャーと結合されています。

enter image description here

設定方法

セットアップはオプション1とほぼ同じですが、さらに、データフォルダー(オプション1を参照)で、対応するワークスペースで使用可能にするフォルダーへのリンクを作成します(ln -s <source> <destination>を使用)。

enter image description here

スクリプト

#!/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)
4
Jacob Vlijm

他のデスクトップ環境(KDEなど)はこれをネイティブに提供しますが、これはXFCEで部分的にのみサポートされています。

XFCEでネイティブに機能するもの:

  • ワークスペースごとに異なる壁紙を設定できます。これは完全にサポートされており、ワークスペース設定GUIを使用して簡単に構成できます。
  • 特定のワークスペースのパネルに影響を与えることができますが、これを設定できるGUIオプションはありませんが、以下のスクリプトがすべてを担当します。

私が採用したソリューション:

  1. ワークスペースごとに新しいパネルを作成します。また、すべてのワークスペースに表示される補助的なグローバルパネルを作成することもできます(通知バーなどの一部の要素は1回しか追加できないため、すべてのワークスペースに表示する唯一の方法はグローバルパネルに追加することです)。
  2. 以下のスクリプトを構成して実行し、各ローカルパネルを独自のワークスペースに配布します。
  3. XFCEを構成して、起動するたびにスクリプトを実行します。
  4. 必要に応じてパネルを構成します。

他の答えとは異なり、このスクリプトは、毎秒ステータスを取得する無限ループとして実行されません。各ローカルパネルを独自のワークスペースに関連付けるために、セッションを開いている間に一度だけ実行されます。その後、残りのすべてはウィンドウマネージャーによってネイティブに処理されます。

#! /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
  1. このスクリプトを、たとえばlocal-panels.shとしてホームディレクトリに保存し、実行可能にします(chmod u+x ~/local-panels.sh

  2. ニーズに合わせてスクリプトを構成します。

    • $start:XFCEはパネルに番号を付けます。これは、ローカルにしたい最初のパネルの番号です。ここでは、最初のパネルはグローバルに保たれ、パネル2以降は独自のワークスペースに対してローカルになります。
    • $count:ローカルにするパネルの数。デフォルトでは、これはワークスペースの数に等しくなります。ワークスペースごとに1つの異なるローカルパネル。
    • $desk:ローカルパネルを持つ最初のワークスペース。デフォルトでは、すべてのワークスペースにローカルパネルがありますが、この変数をより高い値に設定すると、必要に応じて最初のいくつかのワークスペースにローカルパネルを設定できなくなります。
  3. セッション開始時にこのスクリプトを自動的に開始するようにXFCEを構成します:XFCE Settings Manager> Session and Startupに移動し、Application Autostartタブをクリックします。次に、Addボタンで、各セッションを開くたびにスクリプトの実行をスケジュールします。

1
WhiteWinterWolf