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.
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
La solution ci-dessous fonctionne comme suit:
ou:
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.
Le script utilise à la fois xdotool
et wmctrl
:
Sudo apt-get install xdotool
Sudo apt-get install wmctrl
Ensuite:
preferred_screen
(sans extension) dans ~/bin
. Créez le répertoire si nécessaire.Si vous venez de créer le répertoire ~bin
, exécutez-le dans un terminal:
source ~/.profile
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.
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
#!/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]])
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.
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.