私が4つのワークスペースを使用していて、偶然にももっと必要だと仮定します。自動化されたプロセスがありますか、または不可能な場合は、(Ubuntu tweak
をインストールする代わりに)ワークスペースを偶然に追加する簡単な方法がありますか? などなど)。
承認された回答:
ワークスペースの数を自動的に設定します。必要に応じて、列と行を追加および削除します
ワークスペースマトリックスの最後の列または行を入力した場合にワークスペースを自動的に追加する()バックラウンドスクリプトのバージョンの下。
これがその仕組みです:
-
最後の列または行に到達すると、追加のビューポートが追加されます:
-
ワークスペースが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)
使用方法
- 以下のスクリプトを空のファイルにコピーし、
add_space.py
として保存します -
スクリプトのヘッドセクションで、他の設定(ワークスペースの最大数、デフォルトのマトリックス、たとえば2×2)が必要な場合は、行を編集します。
# --- set default workspaces below (horizontally, vertically) hsize = 2 vsize = 2 # --- set the maximum number of workspaces below max_ws = 10
-
次のコマンドでテスト実行します:
python3 /path/to/add_space.py
-
すべてが正常に機能する場合は、スタートアップアプリケーションに追加します。ダッシュ>スタートアップアプリケーション>コマンドを追加します:
/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: 3360x2100
、wmctrl -d
の出力からも )、現在のマトリックスには2つの列(3360/1680)が含まれていることがわかっており、「最後の」列にあります。
次に、スクリプトは次のコマンドによってマトリックスに列を追加するための命令を送信します。
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,1050
、wmctrl -d
の出力から )。
ただし、簡単にするために、ビューポート1,1
を使用していると仮定します。 (左上のビューポート)、つまりウィンドウの相対位置は等しい その絶対位置。
画面の解像度は1680
なので 、ウィンドウが列3425/1680
にあることがわかります 、3360 and 5040
の間のすべてが含まれるため、切り上げられます マトリックスの同じ列にあります(解像度の3〜4倍)。適切な計算には、math.ceil()
を使用します (python
)
スクリプトもなので 常に右/下に追加のワークスペースを配置するというルールを実践します。列の数を最大に設定する必要があります。 値:
- 現在 ワークスペース列+1
- 最後 ウィンドウのある列
- スクリプトの先頭に設定されているデフォルトの列数
そして、スクリプトはそうします🙂
行はまったく同じ手順で管理されます。