Puis-je configurer Hot Corners pour exécuter des commandes personnalisées dans Unity?

13

J'aime vraiment Hot Corners. :-)

Est-il possible d'une manière ou d'une autre d'exécuter une commande personnalisée dans un coin chaud comme indiqué ci-dessous?

entrez la description de l'image ici

orschiro
la source
Je ne pense pas que ce soit possible avec les hotcorners en particulier (du moins pas avec la façon dont Unity les utilise), mais il est possible de déclencher des scripts lorsque la souris est placée dans une zone spécifique de l'écran. Par exemple, voir askubuntu.com/a/758307/295286 , section Passer la souris sur l'action. J'examinerai davantage les hotcorners, mais si ceux-ci ne fonctionnent pas, le script personnalisé est-il OK?
Sergiy Kolodyazhnyy
Multi-moniteur ou simple?
Jacob Vlijm
Salut orschiro, publié. Veuillez indiquer si tout est clair (ou non).
Jacob Vlijm
Hé, je vois qu'il y a plus de hotcorners ici que dans ma réponse. Combien préférez-vous?
Jacob Vlijm
2
@JacobVlijm, Serg, Voir ma réponse.
wjandrea

Réponses:

10

CCSM

  1. Installez le Gestionnaire de paramètres CompizConfig (CCSM). Exécuter dans le terminal:

    sudo apt-get install compizconfig-settings-manager
  2. Ouvrez CCSM.

  3. Allez dans "Commandes"
  4. Entrez votre commande souhaitée dans l'un des emplacements. Par exemple:

    Capture d'écran CCSM - commande

  5. Allez dans l'onglet "Reliures de bord"

  6. Cliquez sur "Aucun" et définissez votre coin chaud (ou bord) souhaité, qui correspond à la commande que vous venez de définir

    Capture d'écran CCSM - coins chauds

  7. Déplacez votre souris dans le coin

  8. Maintenant, votre commande est exécutée!

    Capture d'écran CCSM - exécution de la commande

Travail confirmé le 14.04.

wjandrea
la source
La plus simple de toutes les solutions proposées. Si la commande souhaitée est mieux réalisée via un script que de simplement pointer la commande compiz vers ce script ou simplement scriptname si le script est dans un dossier bin dans $ PATH. Seul inconvénient possible, l'unité / compiz est connue pour «perdre» aléatoirement les commandes définies par l'utilisateur, c'est-à-dire celles qui ne sont pas intégrées. Comment intégrer une commande utilisateur dépasse le cadre de cette question.
doug
@wjandrea Il est donc implémenté après tout. Compiz ne saisit pas pour m'étonner. Bonne réponse, plus appropriée à ce que recherche OP. + 1'ed
Sergiy Kolodyazhnyy
Malheureusement, vous avez raison, haha. Oui exactement ce qu'OP a demandé.
Jacob Vlijm
Vous m'avez aidé plusieurs fois avec vos modifications et vos réponses. Avoir un "cookie" comme disait ole'Serg ... en effet une demi-douzaine :)
WinEunuuchs2Unix
6

Commandes personnalisées

Si vous utilisez Unity et que ccsm est installé, la réponse de wjandrea est bien sûr votre réponse. Sinon , ou à utiliser sur d'autres distributions, une alternative légère pourrait être utile.

Avec le script ci-dessous, vous pouvez définir n'importe quelle commande, spécifique à chacun de vos hotcorners.

À titre d'exemple, j'ai effectué la configuration suivante:

  • En haut à gauche Aucune action
  • Top Right Run Gedit
  • En bas à gauche Aucune action
  • Terminal Gnome en bas à droite

Bien sûr, vous pouvez également faire exécuter des scripts externes aux commandes.

De plus, vous pouvez définir la taille du coin chaud dans la ligne:

cornersize = 10

Modifiez simplement la valeur (pixels). Le script définit des zones (carrées) pour déclencher vos commandes:

entrez la description de l'image ici

Le script

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

Installer

  1. Le script a besoin xdotool

    sudo apt install xdotool
  2. Copiez le script dans un fichier vide, enregistrez-le sous hotcorners2.py
  3. Dans la tête du script, définissez vos commandes (faites attention aux citations)

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

    (ensuite en haut à gauche / à droite, en bas à gauche / à droite)

  4. Testez-exécutez le script:

    python3 /path/to/hotcorners2.py
  5. Si tout fonctionne bien, ajoutez aux applications de démarrage: Dash> Applications de démarrage> Ajouter. Ajoutez la commande:

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

Remarques

  • Le script s'exécute actuellement sur (le premier) écran. Il peut être facilement modifié pour prendre en charge plusieurs écrans, voire faire différentes choses dans différents écrans, veuillez le mentionner.
  • Si quelques personnes l'aiment, nous pouvons ajouter un gui et un ppa pour une utilisation pratique et une installation facile.

ÉDITER

Si nous utilisons un calcul un peu plus avancé, nous pouvons utiliser un rayon au lieu d'une zone carrée pour déclencher les commandes (grâce au bon vieux @pythagoras):

entrez la description de l'image ici

Petite différence, mais juste pour le plaisir:

Le script

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

Usage

C'est à peu près la même chose. Définissez vos commandes et le rayon à déclencher dans la section head du script.

Jacob Vlijm
la source
5

REMARQUE:

La réponse de wjandrea est la réponse la plus appropriée pour quelqu'un qui utilise Ubuntu par défaut ou Ubuntu Kylin (ou a compiz comme gestionnaire d'affichage), donc cela obtient mon vote positif et mon respect. La réponse fournie ci-dessous peut également être utilisée sur Unity, mais serait probablement légèrement redondante. Cependant, sur les environnements de bureau qui n'ont pas de compiz, on peut utiliser l'indicateur présenté ci-dessous. Je l'ai testé brièvement dans Lubuntu 16.04 VM, donc je sais que cela fonctionne là-bas, et je l'ai également rendu compatible avec Kylin 14.04. Pour les bureaux GNOME et MATE, vous aurez besoin d'avoir la prise en charge des AppIndicators activée en premier afin d'utiliser n'importe quel indicateur.

introduction

J'ai implémenté indicator-edgerce qui permet de déclencher des commandes définies par l'utilisateur en fonction de la position de la souris n'importe où le long des 4 bords de l'écran. La version originale a été réalisée en une journée, en environ 7 heures, elle est donc assez minimaliste mais fait l'affaire.

entrez la description de l'image ici

L'indicateur est contrôlé par ~/.edger-commands.jsonfichier, évidemment au jsonformat. Il peut être écrit manuellement par l'utilisateur, ou défini via l' DEFINE COMMANDSoption de l'indicateur . L'option d'activation / désactivation du déclenchement est mémorisée et écrite automatiquement dans le fichier pour la commodité de l'utilisateur. Un exemple de fichier de configuration serait comme ceci:

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

Notez l' "left"entrée dans le fichier. Ce bord n'est pas défini, mais en raison de la jsonsyntaxe, il nécessite d'avoir une chaîne vide, c'est-à-dire des guillemets "".

Une fois que l'indicateur détecte que l'utilisateur a placé la souris le long de l'un des bords (avec une marge de ~ 3 pixels), l'indicateur enverra une notification à bulles et exécutera la commande appropriée (si définie). L'activation du déclencheur ne se répétera que si l'utilisateur éloigne la souris du bord.

entrez la description de l'image ici

Comme vous pouvez le voir sur la capture d'écran ci-dessus, l'indicateur a également une sortie de débogage dans la ligne de commande. Si vous trouvez des bogues, n'hésitez pas à l'exécuter à partir du terminal, découvrez quelle erreur se produit et soumettez le rapport de bogue approprié sur la page des problèmes du GitHub du projet .

Actuellement, il n'y a pas de support pour les coins (uniquement les bords) et il a été conçu pour une configuration à un seul moniteur (évidemment, on ne peut pas couvrir toutes les bases dans les 7 heures suivant la création), mais ces fonctionnalités pourraient être disponibles à terme.

Installation et code source

Le code source est disponible sur la page GitHub du projet ou via Launchpad . L'installation s'effectue via les commandes suivantes dans le terminal:

sudo add-apt-repository ppa:1047481448-2/sergkolo
sudo apt-get update
sudo apt-get install indicator-edger
Sergiy Kolodyazhnyy
la source