J'utilise une configuration à double écran. Ubuntu 14.10/Unity. Chaque écran a son propre lanceur/Dash. Les applications par défaut telles que Firefox, Nautilus, Terminal & Thunderbird apparaissent sur l’écran où j’ai utilisé le lanceur. Alors, quand j'utilise le lanceur pour Firefox sur l'écran de droite, le navigateur s'ouvre sur l'écran de droite. Comme cela devrait être.
Je voudrais ce comportement avec une autre application comme Google Chrome. Je n'arrive pas à trouver une solution adéquate.
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 fichier .desktop
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.
Il y a un inconvénient: si vous remplacez la commande main du fichier .desktop
par la commande permettant d'appeler ce script, le clic droit "ouvrir avec" ne fonctionnera pas correctement. Dans le cas d'un navigateur Web tel que Google Chrome, le problème ne sera pas trop grave. Avec d’autres applications, une solution simple consisterait à ajouter l’option permettant d’ouvrir une nouvelle fenêtre sur l’écran actuel sous forme de raccourci (voir plus loin).
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 le nom open_oncurrent
(sans extension) dans ~/bin
Copiez le fichier .desktop
correspondant de /usr/share/applications
dans ~/.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
Editez le fichier (deux options):
Pour changer la commande main du lanceur:
trouvez la ligne:
Exec=/usr/bin/google-chrome-stable %U
changez le en
Exec=/bin/bash -c "open_oncurrent /usr/bin/google-chrome-stable"
Pour ajouter l'option sous forme de raccourci (comme dans l'image ci-dessus):
trouvez 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
De même, vous pouvez appliquer la solution à d'autres applications. La syntaxe de la commande à utiliser dans le fichier .desktop
ressemble à 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.
#!/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 en tant que gestionnaire de composition, qui dispose de toutes sortes de plug-ins pour ce genre de choses. Pour rendre l'histoire simple et longue sans déranger la ligne de commande, installez Compiz Config Settings Manager (avec Sudo apt-get install compizconfig-settings-manager
ou via le Centre logiciel), et recherchez Place Windows
, assurez-vous que la case est cochée.
Sous ce plugin, il y aura plusieurs options pour Multi Output Mode
. Ce que vous voulez, c'est Use output device of focused window
. Ainsi, il placera la fenêtre de fichier ouvert où que se trouve votre gestionnaire de fichiers