web-dev-qa-db-fra.com

Comment désactiver les coins chauds pour des fenêtres maximisées

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?

3
John

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.

1. Désactiver tous hotcorners si la fenêtre active est en plein écran

Le patch d’arrière-plan ci-dessous désactivera tous hotcorners si (et tant que) la fenêtre active est agrandie (plein écran).

Le scénario

#!/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

Comment utiliser

  1. Le script nécessite à la fois xdotool et wmctrl:

    Sudo apt-get install wmctrl xdotool
    
  2. Copiez le script dans un fichier vide et protégez-le en tant que disable_corners.py
  3. Test- lance le script depuis un terminal avec la commande:

    python3 /path/to/disable_corners.py
    
  4. 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"
    

2. Désactiver uniquement les bords spécifiques si la fenêtre active est en plein écran

Le script (d'arrière-plan) ci-dessous désactivera les deux actions que vous mentionnez si la fenêtre active est agrandie.

Le scénario

#!/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

Comment utiliser

L'utilisation et la configuration sont identiques à celles de l'option 1.

Explication

  • Au démarrage du script, le script vérifie la résolution de l'écran.
  • Une fois par seconde, le script vérifie la taille de la fenêtre active et la compare à la résolution de l'écran.
  • Si la taille et la résolution de la fenêtre sont égales, la fenêtre est évidemment maximisée.
  • 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.

5
Jacob Vlijm