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?
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?
Réponses:
Installez le Gestionnaire de paramètres CompizConfig (CCSM). Exécuter dans le terminal:
sudo apt-get install compizconfig-settings-manager
Ouvrez CCSM.
Entrez votre commande souhaitée dans l'un des emplacements. Par exemple:
Allez dans l'onglet "Reliures de bord"
Cliquez sur "Aucun" et définissez votre coin chaud (ou bord) souhaité, qui correspond à la commande que vous venez de définir
Déplacez votre souris dans le coin
Maintenant, votre commande est exécutée!
Travail confirmé le 14.04.
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:
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:
#!/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
Le script a besoin xdotool
sudo apt install xdotool
hotcorners2.py
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)
Testez-exécutez le script:
python3 /path/to/hotcorners2.py
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"
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):
Petite différence, mais juste pour le plaisir:
#!/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
C'est à peu près la même chose. Définissez vos commandes et le rayon à déclencher dans la section head du script.
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.
J'ai implémenté indicator-edger
ce 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.
L'indicateur est contrôlé par ~/.edger-commands.json
fichier, évidemment au json
format. Il peut être écrit manuellement par l'utilisateur, ou défini via l' DEFINE COMMANDS
option 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 json
syntaxe, 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.
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.
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