Je cherche l’équivalent clavier pour appuyer sur le bouton central de la souris alors que le curseur est sur la barre de titre supérieure de la fenêtre. Cela abaisse cette fenêtre de manière à ce qu'elle soit derrière toutes les autres fenêtres.
Réaliser une commande qui fait ce que vous voulez s'avère plus compliqué qu'il n'y parait à première vue. Le problème est de baisser la fenêtre et de maintenir l'ordre des fenêtres (z -wise) en même temps, ce qui semble presque impossible. xdotool
et wmctrl
fournissent des commandes à augmenter une fenêtre, mais pas à inférieur une fenêtre.
La solution ci-dessous est une solution de contournement, mais elle fonctionne néanmoins de manière fiable et efficace. Il utilise à la fois wmctrl
et xdotool
, qui ne figurent pas sur votre système par défaut.
Bien que le script soit exécuté par un raccourci clavier, il fait exactement la même chose que lorsque vous cliquez avec le bouton du milieu sur le haut de votre fenêtre. Ce qu'il fait:
xprop -root
)wmctrl -lG
en tant que fenêtre)Tout cela se passe en une fraction de seconde, vous ne remarquerez donc même pas que la souris bouge et recule. La seule chose que vous remarquez, c'est la fenêtre envoyée à l'arrière, qui correspond exactement à ce que vous souhaitez.
#!/usr/bin/env python3
import subprocess
import time
# find the frontmost window
active = [l for l in subprocess.check_output(["xprop", "-root"]).decode("utf-8").splitlines() \
if "_NET_ACTIVE_WINDOW(WINDOW)" in l][0].split("#")[-1].strip()
# convert the window-id from xprop- format to wmctrl- format
w_id = active[:2] + str((10-len(active))*"0")+active[2:]
# if the window is a "normal" window, find the window geometry in wmctrl -lG,
# move the mouse to the top of the window and click the middle button
if "_NET_WM_WINDOW_TYPE_NORMAL" in subprocess.check_output(["xprop", "-id", w_id]).decode("utf-8"):
match = [l for l in subprocess.check_output(["wmctrl", "-lG"]).decode("utf-8").splitlines() if w_id in l][0].split()[2:6]
current_mousepos = subprocess.check_output(["xdotool", "getmouselocation"]).decode("utf-8").split()
coords = ([s.replace("x:", "") for s in current_mousepos if s.startswith("x:")][0],
[s.replace("y:", "") for s in current_mousepos if s.startswith("y:")][0])
top_x = str(int(int(match[0])+(int(match[2])/2))); top_y = str(int(match[1]) -10)
# The time.sleep(0.3) possibly needs to be optimized (longer sleep = safer); the 0.3 works fine on my system when used from a keyboard shortcut (which turns out to make a difference...)
subprocess.Popen(["xdotool", "mousemove", "--sync", top_x, top_y]); time.sleep(0.3)
# move the mouse back to its original position
subprocess.Popen(["xdotool", "click", "2"]); time.sleep(0.05)
subprocess.Popen(["xdotool", "mousemove", coords[0], coords[1]])
Installez à la fois wmctrl
et xdotool
Sudo apt-get install xdotool wmctrl
Copiez le script ci-dessus dans un fichier vide, enregistrez-le sous le nom sendtoback.py
Testez le script en ouvrant un terminal, lancez la commande qu'il contient:
python3 /path/to/sendtoback.py
La fenêtre doit être envoyée en arrière-plan, exactement comme vous le faisiez lorsque vous avez cliqué au milieu.
Si tout fonctionne correctement, choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés". Cliquez sur le "+" et ajoutez la commande:
python3 /path/to/sendtoback.py
à un raccourci clavier de votre choix.
Dans certains cas (notamment sur les systèmes plus lents), le temps de sommeil dans la ligne:
subprocess.Popen(["xdotool", "mousemove", "--sync", top_x, top_y]); time.sleep(0.3)
doit être augmenté. Sur des systèmes plus rapides, cela pourrait être réduit.
Gnome fournit des liaisons de clé via gnome-keybinding-properties
dans Gnome 2 et via gnome-control-center keyboard
dans Gnome 3.
Dans Gnome 2, la combinaison de touches active par défaut qui se rapproche de ce que vous voulez est
Soulevez la fenêtre si elle est couverte par une autre fenêtre, sinon abaissez-la
en utilisant un raccourci de Win+space