Rediriger la commande pour exécuter une application
La plupart des applications ouvrent leur fenêtre sur l'écran à partir duquel elles ont été lancées (à partir de Dash ou du lanceur). Cependant, certaines applications ne le font pas, mais elles peuvent y être forcées en redirigeant la commande pour exécuter l'application via le script ci-dessous. Pour ce faire, vous devrez éditer le .desktop
fichier correspondant (lanceur).
La configuration semble un peu compliquée, mais si la procédure est suivie ("Comment utiliser"), cela ne devrait pas être trop difficile du tout.
Comment ça fonctionne
- Le script lit la position de la souris au moment où vous cliquez sur le lanceur ou choisissez l'application dans Dash, et détermine sur quel écran il s'agit (gauche / droite).
- Subséquemment, il attend que la nouvelle fenêtre apparaisse, appartenant à l'application (pid) que vous avez lancée.
- Une fois que la fenêtre apparaît, il vérifie si la position de la fenêtre (écran) correspond à la position initiale de la souris (écran).
- Sinon, il déplace la fenêtre vers l'écran à partir duquel vous avez démarré l'application. Dans la plupart des cas, l'action sera à un stade (très) précoce de l'existence de la fenêtre, donc vous ne la remarquerez même pas.
Problème / solution
Il y a un inconvénient: si vous remplacez la commande principale.desktop
du fichier par la commande pour appeler ce script, le clic droit "ouvrir avec" ne fonctionnera pas correctement. Dans le cas d'un navigateur Web comme Google Chrome, ce ne sera pas un problème trop important. Avec d'autres applications, une solution simple serait d'ajouter l'option d'ouvrir une nouvelle fenêtre sur l'écran actuel comme raccourci (voir ci-dessous).
Comment utiliser:
Le script utilise à la fois wmctrl
et xautomation
:
sudo apt-get install xautomation
sudo apt-get install wmctrl
Créez un répertoire ~/bin
s'il n'existe pas encore.
Copiez le script dans un fichier vide, enregistrez-le sous open_oncurrent
(sans extension) dans~/bin
- Rendez-le exécutable (!)
Copiez le .desktop
fichier correspondant de /usr/share/applications
à ~/.local/share/applications
:
cp /usr/share/applications/google-chrome.desktop ~/.local/share/applications/google-chrome.desktop
Ouvrez la copie locale dans ~/.local/share/applications
:
gedit ~/.local/share/applications/google-chrome.desktop
Modifiez le fichier (deux options):
Pour modifier la commande principale du lanceur:
Pour ajouter l'option comme raccourci (comme dans l'image ci-dessus):
trouver la ligne:
X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito;
remplacez-le par:
X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito;New window on this screen;
Ajoutez ensuite la section suivante à la toute fin du fichier:
[New window on this screen Shortcut Group]
Name=New window on this screen
Exec=/bin/bash -c "open_oncurrent /usr/bin/google-chrome-stable"
TargetEnvironment=Unity
Comment utiliser avec d'autres applications:
De même, vous pouvez appliquer la solution à d'autres applications. La syntaxe de la commande à utiliser dans le .desktop
fichier est comme dans l'exemple:
Exec=/bin/bash -c "open_oncurrent <command>"
Une petite explication supplémentaire sur la façon de traiter les exceptions se trouve dans le script.
Le scénario
#!/usr/bin/env python3
import subprocess
import sys
import time
import getpass
t = 0; user = getpass.getuser(); application = sys.argv[1]
"""
In most cases, the command to run an application is the same as the process
name. There are however exceptions, to be listed below, if you use these appli-
cations i.c.w. this script. Just add an item to the list in the format:
["<command>", "<process_name>"],
"""
exceptions = [
["/usr/bin/google-chrome-stable", "chrome"],
]
try:
procname = [app[1] for app in exceptions if app[0] == application][0]
except IndexError:
procname = application
get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
# initial position of the mouse (click position)
start_pos = int(get("xmousepos").strip().split()[0])
# x- position of right side of the screen
x_res = [int(s.split("x")[0]) for s in get("xrandr").split() if s.endswith("+0+0")][0]
# current windows
start_windows = get("wmctrl -l")
# open application
subprocess.call(["/bin/bash", "-c", application+"&"])
while t < 30:
procs = get("ps -u "+user).splitlines()
new = [w for w in get("wmctrl -lpG").splitlines() if not w.split()[0] in start_windows]
match = sum([[line for line in procs if w.split()[2] in line and procname[:15] in line] for w in new], [])
if len(match) == 1:
data = new[0].split(); curr_pos = int(data[3]); compare = (start_pos > x_res, curr_pos > x_res)
if compare[0] == compare[1]:
pass
else:
if compare[0] == True:
data[3] = str(int(data[3])+x_res)
else:
data[3] = str(int(data[3])-x_res)
cmd1 = "wmctrl -r "+data[0]+" -b remove,maximized_vert,maximized_horz"
cmd2 = "wmctrl -ir "+data[0]+" -e 0,"+(",").join(data[3:7])
for cmd in [cmd1, cmd2]:
subprocess.Popen(["/bin/bash", "-c", cmd])
break
t = t + 1
time.sleep(0.5)
Unity utilise Compiz comme gestionnaire de composition, et qui a toutes sortes de plugins pour ce genre de choses. Pour le rendre simple et long, sans gâcher la ligne de commande, installez Compiz Config Settings Manager (avec
sudo apt-get install compizconfig-settings-manager
ou via le Centre logiciel), et recherchezPlace Windows
, assurez-vous qu'il est cochéSous ce plugin, il y aura plusieurs options pour
Multi Output Mode
. Ce que tu veux c'estUse output device of focused window
. Ainsi, il placera une fenêtre de fichier ouverte où que se trouve votre gestionnaire de fichiersla source