web-dev-qa-db-ja.com

Unity(14.04+)でワークスペースを循環させることはできますか?

キーボードショートカットを構成して、Alt +左​​を押すと左のワークスペースに移動し、Alt +右を押すと右のワークスペースに移動しますが、循環するキーのセットが1つ必要です。理想的には、

workspace 1 + Alt + tab ---> worskspace 2
workspace 2 + Alt + tab ---> worskspace 3
workspace 3 + Alt + tab ---> worskspace 4
workspace 4 + Alt + tab ---> worskspace 1

問題は最後の行です。作業スペース4から作業スペース1に戻る方法がありません。正しいモジュロ4に移動するにはどうすればよいですか?

1
uhuola

ビューポートを切り替えます

小さなスクリプトを使用すると、ワークスペース(実​​際にはビューポート)を参照することが非常によくできます。

  • 進む

    enter image description here

    (最後のビューポートに到達すると、スクリプトは最初のビューポートに移動します)

  • ...またはbackward

    enter image description here

    (最初のビューポートに到達すると、スクリプトは最後のビューポートに移動します)

スクリプト

#!/usr/bin/env python3
import subprocess
import sys

move = sys.argv[1]

# get the needed info from wmctrl -d
wsdata = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
# retrieve total size of workspace
ws = [int(n) for n in wsdata[3].split("x")]
# panel/launcher height/width
pans = [int(n) for n in wsdata[7].split(",")]
# work area
wa = [int(n) for n in wsdata[8].split("x")]
# x/y resolution
res_h = pans[0]+wa[0]; res_v = pans[1]+wa[1]
# current position in the spanning workspace
VP = [int(n) for n in wsdata[5].split(",")]

def last_h():
    # test if we are on the last viewport horizontally
    return VP[0]+res_h == ws[0]

def first_h():
    # test if we are on the first viewport horizontally
    return VP[0] == 0

def last_v():
    # test if we are on the last viewport vertically
    return VP[1]+res_v == ws[1]

def first_v():
    # test if we are on the first viewport vertically
    return VP[1] == 0

if move == "next":
    if last_h() == False:
        command = str(VP[0]+res_h)+","+str(VP[1])
    Elif last_v() == True:
        command = "0,0"
    else:
        command = "0,"+str(VP[1]+res_v)

if move == "prev":
    if first_h() == False:
        command = str(VP[0]-res_h)+","+str(VP[1])
    Elif first_v() == True:
        command = str(ws[0]-res_h)+","+str(ws[1]-res_v)
    else:
        command = str(ws[0]-res_h)+","+str(VP[1]-res_v)

subprocess.Popen(["wmctrl", "-o", command])

使い方

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

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

  3. 2つのコマンドを2つの異なるショートカットキーに追加します。

    python3 /path/to/through_viewports.py next
    

    次のビューポートに移動します。

    python3 /path/to/through_viewports.py prev
    

    前のビューポートに移動するには

    [システム設定]> [キーボード]> [ショートカット]> [カスタムショートカット]を開きます。 +をクリックして、両方のコマンドを好きなショートカットに追加します。

以上ですスクリプトは、ビューポートの設定方法を検出し、ビューポートを循環します。

仕組み、コンセプト

Unityでは、ビューポートは1つの大きなマトリックスに配置されます。これにより、Unityデスクトップが存在する単一のワークスペースがすべて一緒になります。

次のコマンドを使用します。

wmctrl -d

出力では、マトリックス内の現在の場所を見つけるために必要なすべての情報を読み取ることができます。

0  * DG: 5120x2400  VP: 0,0  WA: 65,24 1215x776  N/A
  • 5120x2400は、すべてのビューポート(マトリックス)の合計サイズです
  • 0,0は、マトリックス内の現在のビューポートのx/y位置です(左上、ピクセル)。
  • WA: 65,24 1215x776から、画面の解像度を導出できます(65,24はランチャー/パネルの幅/高さ、1215x776は残りの領域です)

正しい情報が得られたら、スクリプトはマトリックス内のターゲット位置を計算し、次のコマンドで設定します。

wmctrl -o x,y
3
Jacob Vlijm

12.04では、gconf-editorでキーを編集してこの問題を解決しましたが、16.04では同じキーがなかったため、次のように機能しました。

Sudo apt-get install compizconfig-settings-manager

gUIの詳細設定ユーティリティをインストールします。

ccsm

起動します。次にデスクトップウォール>ビューポートスイッチング>ラップアラウンドを許可に移動し、ボックスをオンにしました。

2
ph7four