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


16

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



@JacobVlijm imgur.com/LaDYwGb Upvotedと認められた、本当に素敵な答えてくれてありがとう
kernel_panic

関連:この古い投稿では、「より多くのワークスペースを自動的に作成/削除する方法は?」2つの異なる答えがあります。この場合も、ここでの新しい回答と比較すると、古い回答の満足度は低くなります。
clearkimura

回答:


14

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

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

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

  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. スクリプトのヘッドセクションで、他の設定(ワークスペースの最大数、デフォルトのマトリックス(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`
    

注意

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

説明

以下の話は少し複雑で、主にコーディングではなく概念手順に関する説明です。興味がある場合にのみ読んでください。

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

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

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

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

次に、画面のxサイズがわかってい1680VP: 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倍)にあるため、ウィンドウはcolumn に切り上げられます。適切な計算のためにmath.ceil()python)を使用します

また、スクリプトはルールを実行して常に右/下に追加のワークスペースを配置するため、列の数を次の最大値に設定する必要があります。

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

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

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


1
うわー、素晴らしい答え、すでに賛成=)
AB

@ABありがとう!:)これは私がやりたいことの一種です:)
ジェイコブVlijm

2
@kernel_panicうわー、ありがとう:)私は実際にこのようにPPAにすることを考えています:askubuntu.com/a/608295/72216、そしてこの1つ:askubuntu.com/a/560734/72216、最終的に(将来) 3つすべてを1つの「workspace_tools」アプリケーションにマージして、オプションまたはそのようなものとして設定できます:)。
ジェイコブVlijm

1
@JacobVlijm私は、簡潔さの理由のために、ここから古い回答を削除します:それはまだ誰だ興味のある人のための編集履歴に表示されます...
Fabby

1
どういたしまして...チャットルームのそばに立ち寄って、より頻繁に毒素を排出する必要があります。:P
Fabby

6

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

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

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

ここに画像の説明を入力してください

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

/home/xieerqi/resize-workspaces.sh

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

ここに画像の説明を入力してください

脚本

#!/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]}

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.