J'ai un hotcorner en haut à gauche pour afficher toutes les fenêtres et en bas à droite pour afficher les espaces de travail. C'est agaçant quand ces derniers continuent de s'activer tout en jouant à un jeu. Est-il possible de régler Compiz pour qu'il ignore les coins chauds lorsqu'il y a une fenêtre plein écran?
Ci-dessous deux options; un script pour désactiver tous les hotcorners (temporairement) si votre fenêtre active est agrandie et un autre pour désactiver uniquement les hotcorners spécifiques et les actions que vous mentionnez dans la question.
Les deux scripts sont extrêmement légers et n'imposent aucune charge notable à votre système.
Le patch d’arrière-plan ci-dessous désactivera tous hotcorners si (et tant que) la fenêtre active est agrandie (plein écran).
#!/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
Le script nécessite à la fois xdotool
et wmctrl
:
Sudo apt-get install wmctrl xdotool
disable_corners.py
Test- lance le script depuis un terminal avec la commande:
python3 /path/to/disable_corners.py
Si tout fonctionne correctement, ajoutez-le à Applications de démarrage: Dash> Applications de démarrage> Ajouter. Ajoutez la commande:
/bin/bash -c "sleep 10 && python3 /path/to/disable_corners.py"
Le script (d'arrière-plan) ci-dessous désactivera les deux actions que vous mentionnez si la fenêtre active est agrandie.
#!/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
L'utilisation et la configuration sont identiques à celles de l'option 1.
S'il y a un changement dans la situation (maximisé/non maximisé), le script active/désactive les hotcorners définis à l'aide des commandes suivantes:
dconf write /org/compiz/profiles/unity/plugins/expo/expo-Edge "''"
dconf write /org/compiz/profiles/unity/plugins/scale/initiate-Edge "''"
désactiver, ou
dconf write /org/compiz/profiles/unity/plugins "'|BottomRight'"
dconf write /org/compiz/profiles/unity/plugins "'|TopLeft'"
autoriser.