左上にすべてのウィンドウを表示するホットコーナーと、ワークスペースを表示する右下にホットコーナーがあります。ゲームのプレイ中にこれらがアクティブになり続けるのは面倒です。とにかくCompizを設定して、フルスクリーンウィンドウがあるときにホットコーナーを無視するように設定していますか?
以下の2つのオプション。アクティブウィンドウが最大化された場合にすべてのホットコーナーを(一時的に)無効にするスクリプトと、質問で言及した特定のホットコーナーとアクションのみを無効にするスクリプト。
どちらのスクリプトも非常に軽量であり、システムに目立った負担をかけることはありません。
以下のバックグラウンドパッチは、アクティブウィンドウが最大化されている場合(およびフルスクリーン)、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
スクリプトにはxdotool
とwmctrl
の両方が必要です。
Sudo apt-get install wmctrl xdotool
disable_corners.py
次のコマンドを使用して、ターミナルからスクリプトをテスト実行します。
python3 /path/to/disable_corners.py
すべてが正常に機能する場合は、スタートアップアプリケーションに追加します:ダッシュ>スタートアップアプリケーション>追加コマンドを追加します。
/bin/bash -c "sleep 10 && python3 /path/to/disable_corners.py"
以下の(背景)スクリプトは、アクティブウィンドウが最大化されている場合に言及する両方のコーナーアクションを無効にします。
#!/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とまったく同じです。
状況(最大化/非最大化)に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'"
有効にする。