web-dev-qa-db-fra.com

Comment interagir avec la fenêtre derrière gnome-terminal en appuyant sur la touche de raccourci?

J'utilise souvent Terminal pour écrire du code dans vim, et comme mon Terminal est transparent, je peux voir ce qu'il se cache derrière, donc si j'ai un manuel derrière dans une fenêtre de navigateur ou quelque chose comme ça, alors je peux y faire référence sans avoir besoin de le basculer ou d'avoir à avoir à côté de ma fenêtre Terminal, ce que je préfère ne pas faire car les deux fenêtres deviennent alors plutôt petites.

Mais il y a un inconvénient, j'ai souvent besoin de copier et coller du texte, de descendre la page derrière Terminal, de rechercher des choses dessus, etc.
Et pour ce faire, je dois ensuite passer à ce que je n'aime pas faire, alors ce qui serait mieux serait s'il y avait un moyen de faire en sorte que dans gnome-terminal, lorsque j'appuie sur un certain raccourci clavier, pour qu'il fasse passer mon curseur dans la fenêtre actuelle (qui est transparente et doit rester sur le dessus) afin que je puisse interagir avec la fenêtre derrière (par exemple pour copier et collez du texte, pour descendre la page et rechercher des éléments sur la page) gnome-terminal sans le déplacer ou le placer devant gnome-terminal fenêtre.

Bien sûr, appuyer à nouveau sur le raccourci clavier - ou peut-être un autre si cela ne peut pas être fait avec le même raccourci - devrait ramener les choses à la normale et comment elles étaient avant que j'appuie pour la première fois sur le raccourci, ce qui m'a fait interagir avec la fenêtre derrière.

J'aimerais aussi que mon clavier interagisse avec la fenêtre derrière et pas seulement avec mon curseur. Et j'aimerais aussi que ce ne soit le cas que pour le gnome-terminal application car je ne veux pas que cela se produise avec d'autres applications.

Cela peut-il être fait?

J'utilise Ubuntu GNOME 15.10 avec GNOME 3.18.

3
user364819

Pas littéralement ce que vous avez demandé, mais si vous avez une combinaison de touches qui reconnaîtrait automatiquement les deux gnome-terminal -window et la fenêtre juste en dessous, vous pouvez basculer (basculer) rapidement entre les deux sans effort supplémentaire.

La configuration fait exactement cela: Si (et seulement si) soit la fenêtre active ou la fenêtre juste en dessous est un gnome-terminal fenêtre, le script les fait changer de place, comme le montrent les images. J'ai laissé quelques fenêtres non pertinentes pour illustrer qu'elles ne participent pas au basculement:

  1. Avoir un gnome-terminal fenêtre au-dessus d'une fenêtre gedit:

    enter image description here

  2. En appuyant sur le raccourci:

    enter image description here

  3. Appuyez à nouveau:

    enter image description here

Etc. Comme mentionné, cela ne se produira que si l'une des fenêtres les plus hautes appartient à gnome-terminal.

Comment installer

  1. Les scripts ont besoin de wmctrl

    Sudo apt-get install wmctrl
    
  2. Enregistrez les deux scripts ci-dessous dans un même répertoire , car l'un des scripts importe des fonctions de l'autre:

    Script 1
    à enregistrer sous (exactement) z_list.py:
    Il s'agit en fait d'un script d'arrière-plan, gardant une trace de l'ordre z des fenêtres. L'ordre z ne peut pas être déterminé par les outils "normaux" comme wmctrl ou xdotool. L'exécution d'un script simple pour garder une trace de la fenêtre actuellement active nous donnera cependant l'ordre z.

    #!/usr/bin/env python3
    import subprocess
    import time
    import os
    
    rootdata = os.environ["HOME"]+"/.focus_history"
    
    def current_windows():
        try:
            return subprocess.check_output(["wmctrl", "-lp"]).decode("utf-8")
        except subprocess.CalledProcessError:
            pass
    
    def convert_format(w_id):
        return w_id[:2]+(10-len(w_id))*"0"+w_id[2:]
    
    def read_data():
        return open(rootdata).read().splitlines()
    
    def get_top(wlist):
        try:
            top = convert_format([l.split("#")[-1].strip() for l in \
               subprocess.check_output(["xprop", "-root"]).decode("utf-8").splitlines() \
                   if "_NET_ACTIVE_WINDOW(WINDOW)" in l][0])       
            return [l for l in wlist if top in l][0]
        except IndexError:
            pass
    
    if __== "__main__":
        open(rootdata, "wt").write("This is an empty line")
        while True:
            time.sleep(0.5)
            wdata = current_windows()
            if wdata != None:
                wlist = wdata.splitlines()
                # get frontmost window (as in wmctrl -lG)
                top = get_top(wlist)
                oldlist = read_data()
                if not any([top == oldlist[0], top == None]):
                    # clean up closed windows
                    [oldlist.remove(l) for l in oldlist if not l.split()[0] in wdata]
                    # remove possible other mentions of the active window
                    [oldlist.remove(l) for l in oldlist if l.startswith(top.split()[0])]
                    open(rootdata, "wt").write(("\n").join([top]+oldlist))
    

    Script 2
    à enregistrer sous toggle_terminal.py:
    Comme mentionné, enregistrez ce script dans un seul et même répertoire, avec z_list.py.

    #!/usr/bin/env python3
    import subprocess
    import z_list
    
    try:
        termpid = subprocess.check_output(["pidof", "gnome-terminal"]).decode("utf-8").strip()
        wlist = z_list.read_data(); top = wlist[0]; second = wlist[1]
        if any([termpid in top, termpid in second]):
            subprocess.Popen(["wmctrl", "-ia", second.split()[0]])
    except subprocess.calledProcessError:
        pass
    

Comment utiliser

Comme le script d'arrière-plan garde une trace de fenêtres actives et crée l'ordre z de cette façon, il doit exécuter avant vous ouvrez (au moins) les fenêtres que vous Je souhaite basculer, de préférence en tant qu'application de démarrage.

Pour tester:

Ouvrez une fenêtre de terminal, exécutez le script d'arrière-plan par la commande:

python3 /path/to/z_list.py

Ouvrez une nouvelle fenêtre de terminal et (par exemple) une fenêtre gedit. Concentrez la fenêtre gedit et ouvrez une nouvelle fenêtre de terminal par-dessus. Exécutez ensuite dans la fenêtre du terminal la commande:

python3 /path/to/toggle_terminal.py

Les fenêtres doivent changer de place (ordre). Malheureusement, vous ne pourrez pas réexécuter la commande (dans le terminal) pour remettre la fenêtre du terminal au sommet, car la fenêtre gedit est maintenant active :). Vous pouvez supposer cependant que cela fonctionnera à partir d'une touche de raccourci.

Si tout fonctionne bien, rendez la configuration permanente:

  • Ajouter z_list.py aux applications de démarrage: Dash> Applications de démarrage> Ajoutez la commande:

    /bin/bash -c "sleep 15 && python3 /path/to/z_list.py"
    
  • Ajoutez le script 2 à une combinaison de touches de raccourci: choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés". Cliquez sur le "+" et ajoutez la commande:

    python3 /path/to/toggle_terminal.py
    
2
Jacob Vlijm