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

8

J'utilise une configuration à double écran. Ubuntu 14.10 / Unity. Chaque écran a son propre lanceur / Dash. Des applications par défaut comme Firefox, nautilus, terminal et 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.

J'aimerais ce comportement avec une autre application comme Google Chrome. Je n'arrive pas à trouver une bonne solution.

Digiplace
la source

Réponses:

5

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

<image>

Comment utiliser:

  • Le script utilise à la fois wmctrlet xautomation:

    sudo apt-get install xautomation
    sudo apt-get install wmctrl
    
  • Créez un répertoire ~/bins'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 .desktopfichier 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):

    1. Pour modifier la commande principale du lanceur:

      • trouver la ligne:

        Exec=/usr/bin/google-chrome-stable %U
        
      • le changer en

        Exec=/bin/bash -c "open_oncurrent /usr/bin/google-chrome-stable"
        
    2. 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 .desktopfichier 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)
Jacob Vlijm
la source
Merci, cela fonctionne. Je remarque une deuxième icône de Google Chrome sur le lanceur lorsqu'il est ouvert.
Digiplace
6

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-managerou via le Centre logiciel), et recherchez Place Windows, assurez-vous qu'il est coché

entrez la description de l'image ici

Sous ce plugin, il y aura plusieurs options pour Multi Output Mode. Ce que tu veux c'est Use output device of focused window. Ainsi, il placera une fenêtre de fichier ouverte où que se trouve votre gestionnaire de fichiers entrez la description de l'image ici

Sergiy Kolodyazhnyy
la source