web-dev-qa-db-ja.com

dockyを1つのワークスペースでのみ使用可能にする方法

Ubuntu 14.04の1つのワークスペースでのみdockyを使用可能にし、他のワークスペースでは使用できないようにする方法はありますか?.

3
Shash

Dockyを特定のワークスペースで実行する(またはしない)バックグラウンドスクリプト

現在のワークスペースに応じて、Dockyランチャーを開始/停止するバックグラウンドスクリプトの下で、 この答え とまったく同じメカニズムに基づいています。

メカニズム自体はかなりテスト済みです。とはいえ、リンクされた質問では、異なるUnityランチャーの設定と異なる壁紙の設定Dockyの開始/停止ではなく、ワークスペースごと。しかし、それは何の違いもないはずであり、私がテストした時間では、単一のエラーなしで実行されました。

使い方

  1. スクリプトにはwmctrlが必要です:

    Sudo apt-get install wmctrl
    
  2. 以下のスクリプトを空のファイルにコピーし、docky_perworkspace.pyとして保存します

  3. スクリプトをテスト実行します。

    • 開始Docky
    • 次のコマンドでスクリプトを開始します。

      python3 /path/to/docky_perworkspace.py
      
    • これで、Dockyがすべてのワークスペースで実行されます。あなたがしたくないDockyを表示して実行したいワークスペースに移動します(ワークスペースで):

      pkill docky
      

    N.B. pkill dockyを使用し、独自のメニューからdockyを閉じないでください!

  4. それだけです。設定を変更したい場合は、実行したいワークスペースでdockyを開始または強制終了します。スクリプトはあなたの好みを記憶します。
  5. すべて正常に動作する場合は、スタートアップアプリケーションに追加します。ダッシュ>スタートアップアプリケーション>コマンドを追加:

    /bin/bash -c "sleep 15&&python3 /path/to/docky_perworkspace.py"
    

スクリプト

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

datadir = os.environ["HOME"]+"/.config/docky_run"
if not os.path.exists(datadir):
    os.makedirs(datadir)
workspace_data = datadir+"/docky_set_"

def get_runs():
    try:
        subprocess.check_output(["pgrep", "docky"]).decode("utf-8")
        return True
    except:
        return False

def get_res():
    # get resolution
    xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
    pos = xr.index("current")
    return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]

def current():
    # get the current viewport
    res = get_res()
    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_ws1 = current()
runs1 = get_runs()

while True:
    time.sleep(1)
    runs2 = get_runs()
    curr_ws2 = current()
    datafile = workspace_data+curr_ws2
    if curr_ws2 == curr_ws1:
        if runs2 != runs1:
            open(datafile, "wt").write(str(runs2))
    else:
        if not os.path.exists(datafile):
            open(datafile, "wt").write(str(runs2))
        else:
            curr_set = eval(open(datafile).read())
            if all([curr_set == True, runs2 == False]):
                subprocess.Popen(["docky"])
            Elif all([curr_set == False, runs2 == True]):
                subprocess.Popen(["pkill", "docky"])           
    curr_ws1 = curr_ws2
    runs1 = get_runs()

説明

スクリプトは、現在のワークスペースを追跡します(ワークスペースの数に関係なく)。ワークスペースごとに、ファイルは/.config/docky_runに作成され、参照するワークスペースにdockyが存在するかどうかが「書き込まれる」(TrueまたはFalse

同じワークスペースにとどまっているが、dockyが開始または強制終了されている(そのpidが表示または終了する)場合、スクリプトは参照しているワークスペースに変更を加えたのがあなたであることを「理解」し、ファイルが更新されます。

ただし、workspaceが変更された場合、スクリプトはファイルが存在するかどうかを確認し、ファイルを読み取り、dockyを起動または強制終了します(または必要でない場合は何もしません)。ファイルの内容と現在の状況。ファイルがまだ存在していない場合(初めてスクリプトを開始してから初めてワークスペースを使用しているため)、ファイルが作成され、現在(最後)の状態に設定されます。

ワークスペースごとの設定はファイルに記憶されるため、再起動後も記憶されます。

2
Jacob Vlijm