web-dev-qa-db-ja.com

最大化されたウィンドウのホットコーナーを無効にする方法

左上にすべてのウィンドウを表示するホットコーナーと、ワークスペースを表示する右下にホットコーナーがあります。ゲームのプレイ中にこれらがアクティブになり続けるのは面倒です。とにかくCompizを設定して、フルスクリーンウィンドウがあるときにホットコーナーを無視するように設定していますか?

3
John

以下の2つのオプション。アクティブウィンドウが最大化された場合にすべてのホットコーナーを(一時的に)無効にするスクリプトと、質問で言及した特定のホットコーナーとアクションのみを無効にするスクリプト。

どちらのスクリプトも非常に軽量であり、システムに目立った負担をかけることはありません。

1.アクティブウィンドウが全画面表示の場合、all hotcornersを無効にします

以下のバックグラウンドパッチは、アクティブウィンドウが最大化されている場合(およびフルスクリーン)、all hotcornersを無効にします。

スクリプト

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

edgedata = os.path.join(os.environ["HOME"], ".stored_edges")
key = "/org/compiz/profiles/unity/plugins/"
corners = [
    "|TopRight", "|TopLeft", "|BottomLeft", "|Right",
    "|Left", "|Top", "|Bottom", "|BottomRight",
    ]

def get(cmd):
    # just a helper function
    try:
        return subprocess.check_output(cmd).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        pass

def setval(cmd):
    # just another helper function
    subprocess.Popen(cmd)

def check_win():
    # see if the active window is maximized
    # get the active window, convert the id to wmctrl format
    windata = get(["wmctrl", "-lG"])
    if windata: 
        w = hex(int(get(["xdotool", "getactivewindow"])))
        front = w[:2]+((10-len(w))*"0")+w[2:]
        # look up the window size
        match = [l for l in windata.splitlines() if front in l][0].split()[4:6]
        # and compare them, if equal -> window is maximized
        return match == res

def get_res():
    # look up screen resolution
    scrdata = get("xrandr").split(); resindex = scrdata.index("connected")+2
    return [n for n in scrdata[resindex].split("+")[0].split("x")]

def get_edges():
    # get data from dump, remember 
    data = get(["dconf", "dump", key]).split()
    for s in data:
        if s.startswith("["):
            k = s.replace("[", "").replace("]", "/")
        Elif any([[c in s][0] for c in corners]):
            currval = s.split("=")
            stored = ["dconf", "write", key+k+currval[0], currval[1]]
            tempval = ["dconf", "write", key+k+currval[0], "''"]
            open(edgedata, "a+").write(str(stored)+"\n")
            setval(tempval)

def set_stored():
    # set the stored values
    try:
        prev = open(edgedata).readlines()
    except FileNotFoundError:
        pass
    else:
        for l in  [l.strip() for l in open(edgedata).readlines()]:
            toset = ast.literal_eval(l)
            setval(toset)
        os.remove(edgedata)

res = get_res()
state1 = None

while True:
    time.sleep(1)
    state2 = check_win()
    if state2 != None:
        if state2 != state1:
            get_edges() if state2 else set_stored()
        state1 = state2

使い方

  1. スクリプトにはxdotoolwmctrlの両方が必要です。

    Sudo apt-get install wmctrl xdotool
    
  2. スクリプトを空のファイルにコピーし、disable_corners.py
  3. 次のコマンドを使用して、ターミナルからスクリプトをテスト実行します。

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

    /bin/bash -c "sleep 10 && python3 /path/to/disable_corners.py"
    

2.アクティブウィンドウがフルスクリーンの場合、特定のエッジのみを無効にします

以下の(背景)スクリプトは、アクティブウィンドウが最大化されている場合に言及する両方のコーナーアクションを無効にします。

スクリプト

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

key = "/org/compiz/profiles/unity/plugins"
active1 = "'|BottomRight'"; active2 = "'|TopLeft'"

def get(cmd):
    # just a helper function
    try:
        return subprocess.check_output(cmd).decode("utf-8")
    except subprocess.CalledProcessError:
        pass

def setval(cmd):
    # just another helper function
    subprocess.Popen(cmd)

def check_win():
    # see if the active window is maximized
    # get the active window, convert the id to wmctrl format
    windata = get(["wmctrl", "-lG"])
    if windata: 
        w = hex(int(get(["xdotool", "getactivewindow"])))
        front = w[:2]+((10-len(w))*"0")+w[2:]
        # look up the window size
        match = [l for l in windata.splitlines() if front in l][0].split()[4:6]
        # and compare them, if equal -> window is maximized
        return match == res

def get_res():
    # look up screen resolution
    scrdata = get("xrandr").split(); resindex = scrdata.index("connected")+2
    return [n for n in scrdata[resindex].split("+")[0].split("x")]

res = get_res()
state1 = None

while True:
    time.sleep(1)
    state2 = check_win()
    if state2 != None:
        if state2 != state1:
            newws = "''" if state2 else active1
            # below the specific edges to take care of
            setval(["dconf", "write", key+"/expo/expo-Edge", newws])
            newspread = "''" if state2 else active2
            setval(["dconf", "write", key+"/scale/initiate-Edge", newspread])
        state1 = state2

使い方

使用方法とセットアップは、オプション1とまったく同じです。

説明

  • スクリプトの起動時に、スクリプトは画面の解像度をチェックします。
  • 1秒に1回、スクリプトはアクティブなウィンドウのサイズを確認し、画面の解像度と比較します。
  • ウィンドウのサイズと解像度が等しい場合、ウィンドウは明らかに最大化されます。
  • 状況(最大化/非最大化)にchangeがある場合、スクリプトは次のコマンドを使用して、設定されたホットコーナーを設定/設定解除します。

    dconf write /org/compiz/profiles/unity/plugins/expo/expo-Edge "''"
    
    dconf write /org/compiz/profiles/unity/plugins/scale/initiate-Edge "''"
    

    無効にする、または

    dconf write /org/compiz/profiles/unity/plugins "'|BottomRight'"
    
    dconf write /org/compiz/profiles/unity/plugins "'|TopLeft'"
    

    有効にする。

5
Jacob Vlijm