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.
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:
Avoir un gnome-terminal
fenêtre au-dessus d'une fenêtre gedit
:
En appuyant sur le raccourci:
Appuyez à nouveau:
Etc. Comme mentionné, cela ne se produira que si l'une des fenêtres les plus hautes appartient à gnome-terminal
.
Les scripts ont besoin de wmctrl
Sudo apt-get install wmctrl
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
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