web-dev-qa-db-ja.com

必要な場合にのみ、ワークスペースを自動的に追加するにはどうすればよいですか?

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

16
kernel_panic

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

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

これがどのように機能するか:

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

    enter image description here

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

    enter image description here

スクリプト:

#!/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. スクリプトのヘッドセクションで、他の設定(ワークスペースの最大数、デフォルトのマトリックス、2x2など)が必要な場合は、行を編集します。

    # --- 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`
    

注意

いつものように、このスクリプトは非常に「低負荷」であり、プロセッサに目立った負荷を追加しません。

説明

以下の話は少し複雑で、ほとんどはコーディングではなくconceptprocedureの説明です。興味がある場合にのみ読んでください。

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

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)が含まれ、 " 1。

enter image description here

スクリプトは、コマンドによってマトリックスに列を追加する指示を送信します。

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(左上のビューポート)にいると仮定します。したがって、ウィンドウの相対位置equals絶対位置です。

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

スクリプトalsoは、常に右/下に余分なワークスペースがあるようにルールを実践するため、列数をtheest value ofに設定する必要があります。

  • currentワークスペース列+ 1
  • lastウィンドウが表示された列
  • スクリプトのヘッドに設定されているデフォルトの列数

そして、スクリプトは:)

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

14
Jacob Vlijm

技術的には、ワークスペースのサイズを変更するためのショートカットはありませんが、以下の単純なスクリプトを使用してショートカットにバインドできます。

  1. 以下のスクリプトを使用して、.local/share/applicationsフォルダーに保存するか、任意の場所に保存します。
  2. スクリプトがchmod 755 /path/to/scriptで実行可能になっていることを確認してください
  3. システム設定->キーボード->ショートカット->カスタムショートカットでショートカットにバインドします

たとえば、私はこのセットアップを持っています:

enter image description here

スクリプトはにバインドされています ShiftCtrlAltI。しかし CtrlAltI うまくいくかもしれない。スクリプトの完全なパスを指定します

/home/xieerqi/resize-workspaces.sh

そして、次のようになります。

enter image description here

スクリプト

#!/bin/bash
# Author : Serg Kolo
# Date: Sept 19, 2015
# Purpose: simple script to resize 
# unity workspaces
# Written for: http://askubuntu.com/q/676046/295286

HEIGHT=$(gsettings get org.compiz.core:/org/compiz/profiles/unity/plugins/core/ hsize)
WIDTH=$(gsettings get org.compiz.core:/org/compiz/profiles/unity/plugins/core/ vsize)
NEWSIZE=$(zenity --entry --text="Current desktop set-up $HEIGHT x $WIDTH. Enter new setup in HEIGHTxWIDTH format"  --width=250 | tr 'x' ' ' )

ARRAY=( $NEWSIZE )
[ -z ${ARRAY[1]}  ] && exit
    gsettings set org.compiz.core:/org/compiz/profiles/unity/plugins/core/ hsize ${ARRAY[0]}
    gsettings set org.compiz.core:/org/compiz/profiles/unity/plugins/core/ vsize ${ARRAY[1]}

非常に使いやすく、セットアップが非常に簡単

6