web-dev-qa-db-ja.com

Unityでカスタムコマンドを実行するようにホットコーナーを設定できますか?

Hot Cornersが大好きです。 :-)

以下に示すように、ホットコーナーでカスタムコマンドを実行することはどういうわけですか?

enter image description here

12
orschiro

CCSM

  1. CompizConfig Settings Manager(CCSM)をインストールします。ターミナルで実行:

    Sudo apt-get install compizconfig-settings-manager
    
  2. CCSMを開きます。

  3. 「コマンド」に移動
  4. スロットの1つに目的のコマンドを入力します。例えば:

    CCSM screenshot - command

  5. 「エッジバインディング」タブに移動します

  6. [なし]をクリックして、設定したコマンドに対応する目的のホットコーナー(またはエッジ)を設定します。

    CCSM screenshot - hot corners

  7. マウスを隅に移動します

  8. これでコマンドが実行されました!

    CCSM screenshot - command running

14.04での作業を確認しました。

10
wjandrea

カスタムコマンド

Unityおよびを使用しており、ccsmがインストールされている場合、wjandreaの答えはもちろんあなたの答えです。 そうでない場合、または他のディストリビューションで使用する場合は、軽量の代替手段が役立つ場合があります。

以下のスクリプトを使用すると、各ホットコーナーに固有のanyコマンドを設定できます。

例として、次のセットアップを行いました。

  • 左上アクションなし
  • 右上Geditを実行
  • 左下アクションなし
  • 右下実行Gnome-terminal

もちろん、コマンドに外部スクリプトを実行させることもできます。

さらに、行のホットコーナーのsizeを設定できます。

cornersize = 10

値(ピクセル)を変更するだけです。スクリプトは、コマンドをトリガーするために(正方形の)エリアを設定します。

enter image description here

スクリプト

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

cornersize = 20

commands = [
    None,
    "gedit",
    None,
    "gnome-terminal",
    ]

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8").strip()

def get_pos():
    return [int(s.split(":")[1]) for s in get(["xdotool", "getmouselocation"]).split()[:2]]

scrdata = get("xrandr").split(); resindex = scrdata.index("connected")+2
res = [int(n) for n in scrdata[resindex].split("+")[0].split("x")]

match1 = None

while True:
    time.sleep(1)
    xy = get_pos()
    x = xy[0]; y = xy[1]
    test = [
        [x < cornersize, y < cornersize],
        [x > res[0]-cornersize, y < cornersize],
        [x < cornersize, y > res[1]-cornersize],
        [x > res[0]-cornersize, y > res[1]-cornersize],
        ]
    match2 = [i for i, p in enumerate(test) if all(p)]
    if match2 != match1:
        if match2:
            cmd = commands[match2[0]]
            if cmd:
                subprocess.Popen(["/bin/bash", "-c", cmd])
    match1 = match2

セットアップ

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

    Sudo apt install xdotool
    
  2. スクリプトを空のファイルにコピーし、hotcorners2.pyとして保存します
  3. スクリプトの先頭で、コマンドを設定します(引用符に注意してください)

    commands = [
        None,
        "gedit",
        None,
        "gnome-terminal",
    ]
    

    (続いて左上/右、左下/右)

  4. テスト-スクリプトを実行します。

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

    /bin/bash -c "sleep 5 && python3 /path/to/hotcorners2.py"
    

ノート

  • スクリプトは現在(最初の)画面で実行されます。複数の画面を処理するように簡単に編集でき、画面ごとに異なる処理を行うこともできます。
  • 少数の人々がそれを好めば、私達は便利な使用法および容易なインストールのためにguiおよびppaを追加できます。

編集

もう少し高度なコンピューティングを使用する場合は、正方形の領域の代わりにradiusを使用してコマンドをトリガーできます(古き良き@pythagorasに感謝します)。

enter image description here

小さな違いですが、楽しみのためだけに:

スクリプト

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

# set distance (hotcorner sensitivity)
radius = 20

# top-left, top-right, bottom-left, bottom-right
commands = [
    None,
    "gedit",
    None,
    "gnome-terminal",
    ]

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8").strip()

def get_pos():
    return [int(s.split(":")[1]) for s in get(["xdotool", "getmouselocation"]).split()[:2]]

# get the resolution
scrdata = get("xrandr").split(); resindex = scrdata.index("connected")+2
res = [int(n) for n in scrdata[resindex].split("+")[0].split("x")]
# list the corners, could be more elegant no doubt
corners = [[0, 0], [res[0], 0], [0, res[1]], [res[0], res[1]]]

match1 = None

while True:
    time.sleep(1)
    pos = get_pos()
    # get the current difference from the mousepointer to each of the corner (radius)
    diff = [int(math.sqrt(sum([(c[i]-pos[i])**2 for i, n in enumerate(res)])))\
            for c in corners]
    # see if any of the corners is "approached" within the radius
    match2 = [diff.index(n) for n in diff if n < radius]
    # if so, and the corresponding command is not set to None, run it.
    if all([match2 != match1, match2]):
        cmd = commands[match2[0]]
        if cmd:
            subprocess.Popen(["/bin/bash", "-c", cmd])
    match1 = match2

使用法

ほぼ同じです。スクリプトのheadセクションで、コマンドとトリガーする半径を設定します。

6
Jacob Vlijm

注意:

wjandrea's answer は、デフォルトのUbuntuまたはUbuntu Kylinを使用する(またはディスプレイマネージャーとしてcompizを使用する)人に最も適した回答であるため、賛成と敬意を払われます。以下に示す回答は、Unityでも使用できますが、おそらく多少冗長になります。ただし、compizのないデスクトップ環境では、以下に示すインジケーターを使用できます。 Lubuntu 16.04 VMで簡単にテストしたので、そこで動作することを知っており、Kylin 14.04と互換性があります。 GNOMEおよびMATEデスクトップの場合、インジケーターを使用するには、最初にAppIndicatorsを有効にする必要があります。

前書き

indicator-edgerを実装しました。これにより、画面の4つの端に沿った任意の場所のマウス位置に基づいて、ユーザー定義のコマンドをトリガーできます。元のバージョンは約7時間で1日以内に実行されたため、かなり最小限に抑えられていますが、作業は完了しています。

enter image description here

インジケーターは、明らかにjson形式の~/.edger-commands.jsonファイルを介して制御されます。ユーザーが手動で作成するか、インジケーターのDEFINE COMMANDSオプションで設定できます。トリガーの有効化/無効化オプションは記憶され、ユーザーの利便性のためにファイルに自動的に書き込まれます。サンプル構成ファイルは次のようになります。

{
    "right": "gnome-terminal",
    "top": "firefox",
    "left": "",
    "bottom": "gnome-screenshot",
    "enabled": true
}

ファイルの"left"エントリに注意してください。そのEdgeは設定されていませんが、json構文のために、空の文字列、つまり引用符""が必要です。

ユーザーが任意のエッジに沿ってマウスを配置したことをインジケーターが検出すると(〜3ピクセルマージン)、インジケーターはバブル通知を送信し、適切なコマンド(定義されている場合)を実行します。ユーザーがエッジからマウスを離さない限り、トリガーのアクティブ化は繰り返されません。

enter image description here

上記のスクリーンショットからわかるように、インジケーターのコマンドラインにはデバッグ出力もあります。バグを見つけたら、それを端末から自由に実行して、発生したエラーを見つけ、適切なバグレポートを プロジェクトのGitHubの問題ページ に送信してください。

現在、コーナー(エッジのみ)のサポートはなく、1モニターセットアップ用に構築されています(明らかに、作成後7時間以内にすべてのベースをカバーすることはできません)が、それらの機能は将来的に利用可能になる可能性があります。

インストールとソースコード

ソースコードは、プロジェクト GitHub ページまたは Launchpad で入手できます。ターミナルで次のコマンドを使用してインストールを実行します。

Sudo add-apt-repository ppa:1047481448-2/sergkolo
Sudo apt-get update
Sudo apt-get install indicator-edger
5