web-dev-qa-db-fra.com

Ouvre la fenêtre de l'application sur le même écran que celui où elle a été lancée

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.

8
Digiplace

Redirection de 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 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.

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 se trouver (gauche/droite).
  • Ensuite, il attend que la nouvelle fenêtre apparaisse, appartenant à l'application (pid) que vous avez démarrée.
  • Une fois que la fenêtre apparaît, elle vérifie si la position de la fenêtre (écran) correspond à la position initiale de la souris (écran).
  • Sinon, la fenêtre est déplacée vers l'écran à partir duquel vous avez démarré l'application. Dans la plupart des cas, l'action se déroulera à un stade très précoce de l'existence de la fenêtre, de sorte que vous ne le remarquerez même pas.

Problème/solution

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

<image>

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 le nom open_oncurrent (sans extension) dans ~/bin

  • Rendez-le exécutable (!)
  • 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):

    1. 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"
        
    2. 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
        

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

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)
5
Jacob Vlijm

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.

enter image description here

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 enter image description here

6