GNU/Linux >> Linux の 問題 >  >> Ubuntu

ワークスペースが必要な場合にのみ、ワークスペースを自動的に追加する方法は?

私が4つのワークスペースを使用していて、偶然にももっと必要だと仮定します。自動化されたプロセスがありますか、または不可能な場合は、(Ubuntu tweakをインストールする代わりに)ワークスペースを偶然に追加する簡単な方法がありますか? などなど)。

承認された回答:

ワークスペースの数を自動的に設定します。必要に応じて、列と行を追加および削除します

ワークスペースマトリックスの最後の列または行を入力した場合にワークスペースを自動的に追加する()バックラウンドスクリプトのバージョンの下。

これがその仕組みです:

  1. 最後の列または行に到達すると、追加のビューポートが追加されます:

  2. ワークスペースが5〜10秒間使用されていない場合および その上にウィンドウがない場合、追加のワークスペースは再び削除されます。ただし、常に下に1行追加し、現在のビューポートの右側に1列追加します。

スクリプト:

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

# --- set default workspaces below (horizontally, vertically)
hsize = 2
vsize = 2
# --- set the maximum number of workspaces below
max_ws = 10

def set_workspaces(size, axis):
    subprocess.Popen([
        "dconf", "write", "/org/compiz/profiles/unity/plugins/core/"+axis,
                str(size)
                ])

def get_res():
    resdata = subprocess.check_output(["xrandr"]).decode("utf-8").split()
    curr = resdata.index("current")
    return (int(resdata[curr+1]), int(resdata[curr+3].replace(",", "")))

def wspace():
    try:
        sp = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
        return ([int(n) for n in sp[3].split("x")],
                [int(n) for n in sp[5].split(",")])

    except subprocess.CalledProcessError:
        pass


def clean_up(curr_col, curr_row):
    try:
        w_list = [l.split() for l in subprocess.check_output(["wmctrl", "-lG"]).decode("utf-8").splitlines()]
        xpos = max([math.ceil((int(w[2])+span[1][0])/res[0]) for w in w_list])
        min_x = max(xpos, curr_col+1, hsize)
        if xpos >= hsize:
            set_workspaces(min_x, "hsize")
        else:
            set_workspaces(min_x, "hsize")
        ypos = max([math.ceil((int(w[3])+span[1][1])/res[1]) for w in w_list])
        min_y = max(ypos, curr_row+1, vsize)
        if ypos >= vsize:
            set_workspaces(min_y, "vsize")
        else:
            set_workspaces(min_y, "vsize")
    except subprocess.CalledProcessError:
        pass

res = get_res()
t = 0

while True:
    span = wspace()
    if span != None:
        cols = int(span[0][0]/res[0]); rows = int(span[0][1]/res[1])
        currcol = int((span[1][0]+res[0])/res[0])
        if all([currcol == cols, cols*rows < max_ws]):
            set_workspaces(cols+1, "hsize")
        currrow = int((span[1][1]+res[1])/res[1])
        if all([currrow == rows, cols*rows < max_ws]):
            set_workspaces(rows+1, "vsize")
        if t == 10:
            clean_up(currcol, currrow)
            t = 0
        else:
            t = t+1
        time.sleep(1)

使用方法

  1. 以下のスクリプトを空のファイルにコピーし、add_space.pyとして保存します
  2. スクリプトのヘッドセクションで、他の設定(ワークスペースの最大数、デフォルトのマトリックス、たとえば2×2)が必要な場合は、行を編集します。

    # --- set default workspaces below (horizontally, vertically)
    hsize = 2
    vsize = 2
    # --- set the maximum number of workspaces below
    max_ws = 10
    
  3. 次のコマンドでテスト実行します:

    python3 /path/to/add_space.py
    
  4. すべてが正常に機能する場合は、スタートアップアプリケーションに追加します。ダッシュ>スタートアップアプリケーション>コマンドを追加します:

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

いつものように、スクリプトは非常に「ジュースが少なく」、プロセッサに目立った負荷を加えることはありません。

説明

以下のストーリーは少し複雑で、ほとんどがコンセプトの説明です。 および手順 、コーディングではなく。興味がある場合にのみ読んでください。

必要なワークスペース(列の例)を計算する方法

wmctrl -dの出力 次のようになります:

0  * DG: 3360x2100  VP: 1680,1050  WA: 65,24 1615x1026  N/A

出力では、VP: 1680,1050 スパニングワークスペース(すべてのビューポートのマトリックス)のどこにいるかに関する情報を提供します。この情報は、画面の解像度もある場合にのみ役立ちます。 1680 画面の幅は2つ(可能性は低いですが、それでも)または1回です。
幸い、コマンドxrandrから画面の解像度を解析できます。 。

次に、画面のxサイズが1680であることがわかっている場合 現在、VP: 1680,1050を使用しています 、2番目の列にいることがわかります ワークスペースのマトリックス内。マトリックス全体のサイズもわかっているので(DG: 3360x2100wmctrl -dの出力からも )、現在のマトリックスには2つの列(3360/1680)が含まれていることがわかっており、「最後の」列にあります。

関連:Linux – EFIシェルからbcfgを使用してカーネルにブートパラメーターを追加するにはどうすればよいですか?

次に、スクリプトは次のコマンドによってマトリックスに列を追加するための命令を送信します。

dconf write /org/compiz/profiles/unity/plugins/core/hsize <current_viewport_column+1>

これが原則です。

削除するワークスペースを計算する方法(列の例)

10秒に1回、スクリプトは次のコマンドを使用して、現在開いているすべてのウィンドウを一覧表示するコマンドを実行します。

wmctrl -lG

これにより、次のようなウィンドウの位置に関する情報も得られます。

0x04604837  0 3425 24   1615 1026 jacob-System-Product-Name Niet-opgeslagen document 2 - gedit

出力では、3425 ウィンドウのx位置です。ただし、この図は現在のワークスペースと比較して (左側)。ワークスペースマトリックス内のウィンドウの絶対位置(x方向)を知るには、現在のビューポート情報の最初の番号を追加する必要があります(例:VP: 1680,1050wmctrl -dの出力から )。
ただし、簡単にするために、ビューポート1,1を使用していると仮定します。 (左上のビューポート)、つまりウィンドウの相対位置は等しい その絶対位置。

画面の解像度は1680なので 、ウィンドウが列3425/1680にあることがわかります 、3360 and 5040の間のすべてが含まれるため、切り上げられます マトリックスの同じ列にあります(解像度の3〜4倍)。適切な計算には、math.ceil()を使用します (python

スクリプトなので 常に右/下に追加のワークスペースを配置するというルールを実践します。列の数を最大に設定する必要があります。 値:

  • 現在 ワークスペース列+1
  • 最後 ウィンドウのある列
  • スクリプトの先頭に設定されているデフォルトの列数

そして、スクリプトはそうします🙂

行はまったく同じ手順で管理されます。


Ubuntu
  1. Yumリポジトリを追加する方法

  2. 起動時に特定のワークスペースでプログラムを自動的に開始する方法は?

  3. CentOS / RHEL 7 :特定のカーネルだけにカーネル パラメータを追加する方法

  1. Ubuntuでスワップファイルを追加する方法

  2. Ubuntu11.10でプリンターを追加する方法| Ubuntuにプリンターを追加する

  3. ユーザー アカウントを自動的に作成する方法 ( SSH + LDAP )

  1. Linuxでユーザーをグループに追加する方法

  2. Ppaリポジトリを追加する方法は??

  3. vsftpdでSSL接続のみを強制的に受け入れる方法は?