web-dev-qa-db-fra.com

Comment abaisser la fenêtre de manière à la placer derrière toutes les autres - comme le bouton central de la souris

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.

3
Scott Stensland

Une solution impudique

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:

  • Il recherche la fenêtre active (en utilisant xprop -root)
  • Recherche si la fenêtre est une fenêtre "normale" (contrairement à votre bureau, qui est également répertorié dans wmctrl -lG en tant que fenêtre)
  • Si tel est le cas, il calcule la position du haut de la fenêtre, déplace la souris sur la position calculée, simule le clic du milieu et ramène la souris à l'endroit où vous l'avez laissée.

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.

Le scénario

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

Comment utiliser

  1. Installez à la fois wmctrl et xdotool

    Sudo apt-get install xdotool wmctrl
    
  2. Copiez le script ci-dessus dans un fichier vide, enregistrez-le sous le nom sendtoback.py

  3. 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.

  4. 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.

Remarque

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.

5
Jacob Vlijm

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

0
Randall