web-dev-qa-db-fra.com

Lancer l'application sur un moniteur spécifique

J'ai Ubuntu 14.04 et deux moniteurs. Lorsque j'ouvre des applications, certaines d'entre elles doivent être sur le moniteur principal et d'autres sur le secondaire.
À l'heure actuelle, les applications s'ouvrent toujours dans le moniteur principal.

Les icônes en pointillés ne sont affichées que sur un seul écran (à gauche). Je ne peux donc pas lancer d'applications en utilisant le curseur ou les paramètres de fenêtre active de Compiz.

6
Fiona

Voici une idée de script de démarrage ou au moins un script pouvant être lié à un raccourci pour lancer Windows pour la première fois:

étape 1

Découvrez la largeur et la hauteur de votre fenêtre racine. Cela peut être fait avec

xwininfo -root | awk '/Width/,/Height/ {print}'

ou

xprop -root | awk '$1~/NET_DESKTOP_GEOMETRY/ {print }

Les exemples de résultats sont ci-dessous

$ xwininfo -root | awk '/Width/,/Height/ {print}'                           
  Width: 1366
  Height: 768
$ xprop -root | awk '$1~/NET_DESKTOP_GEOMETRY/ {print}'                                                      
_NET_DESKTOP_GEOMETRY(CARDINAL) = 1366, 768

étape 2

Installez wmctrl avec Sudo apt-get install wmctrl

Cet outil permet de modifier certaines propriétés de Windows en se référant à leur identifiant hexadécimal ou au titre de la fenêtre. J'ai expliqué comment cela fonctionne sur une autre question que je lierai plus tard ici

Étape Créez ce script dans votre dossier ~/bin ou à un emplacement faisant partie de votre chemin. Vous pouvez également associer le chemin d'accès complet à ce script pour créer un raccourci ou créer un raccourci .desktop. Notez que puisque mon écran est de 1366 x 768, j’utilise 1300 comme décalage maximal x du côté droit. Adaptez le script en fonction de vos spécifications à l'étape 1. Notez que si vous avez des fenêtres en double, cela peut casser. C'est donc utile pour le premier lancement de deux fenêtres de programme.

#!/bin/sh
# Author: Serg Kolo
# Description: Send two different applications to different windows
set -x

LEFT=$(zenity --entry --text="What to put on the left?")
RIGHT=$(zenity --entry --text="What to put on the right?")

$LEFT &
$RIGHT &
sleep 1

if [ $? -eq 0 ]; then
    # Get title of the left window
    LEFT_TITLE="$(wmctrl -l | grep -i $LEFT | awk '{$1=$2=$3="";print}')"
    # Get title of the right window
    RIGHT_TITLE="$(wmctrl -l | grep -i $RIGHT | awk '{$1=$2=$3="";print }')"
printf "THIS IS A TEST %s",$LEFT_TITLE
printf "THIS IS A TEST 2 %s",$RIGHT_TITLE
    wmctrl -r $LEFT_TITLE -e 0,0,0,600,600

    sleep 0.5

    wmctrl -r $RIGHT_TITLE -e 0,1300,0,600,600

fi

Maintenant, vous pouvez adapter ce script pour qu'il se comporte comme un lanceur pour une seule fenêtre et spécifier si vous voulez que ce soit à droite ou à gauche. Je travaillerai sur cette idée un peu plus tard dans la journée, mais l’idée de base est d’utiliser à nouveau deux fenêtres contextuelles et une instruction if. Une autre idée que j'ai est d'utiliser awk pour extraire des informations pertinentes à partir d'un seul popup. Je vais modifier ma réponse une fois les scripts complétés

Éditer

Et voici le lanceur pour guichet unique; tapez programname,L pour le placement à gauche et programname,R pour le placement à droite

#!/bin/sh

# set -x
PROG=$(zenity --entry --text="Program,L or R ?")

NAME=$(echo $PROG | cut -d ',' -f1)
SIDE=$(echo $PROG | cut -d ',' -f2)
$NAME &
sleep 1

if [ $? -eq 0 ] 
then

    TITLE=$( wmctrl -l | grep -i $NAME| awk '{$1=$2=$3=""; print}' )

    sleep 0.5
if [ $SIDE = "L" ];then
    wmctrl -r $TITLE -e 0,0,0,600,600
else
    wmctrl -r $TITLE -e 0,1300,0,600,600
fi

fi
2

La solution ci-dessous fonctionne comme suit:

  1. Appuyez sur une combinaison de touches
  2. La première application qui démarre dans les 15 secondes commence à l'écran 1

ou:

  1. Appuyez sur a(nother) combinaison de touches
  2. La première application démarrant dans les 15 secondes commence à l'écran 2

En d'autres termes: vous aurez besoin de deux combinaisons de touches pour vous assurer qu'une nouvelle fenêtre d'application apparaît sur le premier ou le deuxième écran.

Comment mettre en place

Le script utilise à la fois xdotool et wmctrl:

Sudo apt-get install xdotool
Sudo apt-get install wmctrl

Ensuite:

  1. Copiez le script ci-dessous dans un fichier vide, enregistrez-le sous le nom preferred_screen (sans extension) dans ~/bin. Créez le répertoire si nécessaire.
  2. Rendre le script exécutable
  3. Dans la section principale, définissez la résolution horizontale de l’écran de gauche (je l’ai déjà définie pour vous à 1600)
  4. Si vous venez de créer le répertoire ~bin, exécutez-le dans un terminal:

    source ~/.profile
    
  5. Exécuter le script en exécutant dans une fenêtre de terminal la commande suivante:

    preferred_screen 1
    

    Maintenant ouvrez une application (n'importe laquelle), elle devrait s'ouvrir sur le premier écran

    Répétez l'étape avec la commande:

    preferred_screen 2
    

    maintenant, l'application doit s'ouvrir sur le deuxième écran.

  6. Si tout fonctionne correctement, ajoutez les deux commandes à deux combinaisons de touches différentes: Choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés". Cliquez sur le "+" et ajoutez les commandes:

    preferred_screen 1
    preferred_screen 2
    

Le scénario

#!/usr/bin/env python3
import subprocess
import time
import sys

#--- enter the horizontal resolution of the left screen below
left_width = 1600
#---

target_screen = int(sys.argv[1])
get = lambda cmd: subprocess.check_output(cmd).decode("utf-8")

def new_window(left_width):
    w_list1 = get(["wmctrl", "-lG"]).splitlines()
    while True:
        time.sleep(1)
        w_list2 = get(["wmctrl", "-lG"]).splitlines()
        new = [w.split() for w in w_list2 if not w in w_list1]
        if len(new) != 0:
            data = new[0]
            pos = 1 if int(data[2]) < left_width else 2
            coords = data[2:4]
            w_id = data[0]
            return [w_id, pos, coords]
            break

subject = new_window(left_width)
if not int(subject[1]) == target_screen:
    move = -left_width if target_screen == 1 else left_width - int(subject[2][0])
    subprocess.Popen(["xdotool", "windowmove", subject[0], str(int(subject[2][0])+move), subject[2][1]])

Explication

Entrer dans le processus de démarrage lui-même ne me semblait pas une solution propre dans cette situation; la solution ci-dessous fonctionne donc sur une base "accessoire" (uniquement lorsque vous l'appelez à partir d'une combinaison de touches).

Si le script est appelé, il attend 15 secondes qu'une nouvelle fenêtre apparaisse, la déplace vers l'écran de gauche ou celui de droite (si ce n'est pas déjà l'écran ciblé) et se termine par la suite. Au bout de 15 secondes, il se termine quand même pour empêcher une exécution infinie si aucune fenêtre n'apparaît.

Remarque

Le script suppose que les écrans sont en haut des lettres. S'il y a une grande différence, le script peut nécessiter quelques ajustements afin d'éviter que les fenêtres ne "heurtent" la bordure de l'autre écran.

2
Jacob Vlijm