Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 06/11/2015, à 21:01

VincentR

[Résolu] Détecter la fermeture d'une fenêtre

Bonsoir,

Je cherche en vain une solution depuis quelques heures... Voici mon problème :
J'utilise Ubuntu avec une résolution de 1360x768, c'est la plus confortable pour moi.
J'utilise Windows 8.1 via vurtualbox avec une résolution de 1920X1080 (1360x768 n'est pas agréable dans ce cas).
J’exécute un premier script pour Windows :

#!/bin/bash
xrandr -s 1920x1080
VBoxManage startvm "Windows 8.1"
exit 0

Une fenêtre "Windows" s'ouvre et la résolution est de 1920X1080
Lorsque j’arrête Windows, la fenêtre se ferme. J'exécute ensuite un autre script pour retourner à la résolution 1360x768.

Au lieu de deux scripts, je n'en voudrais qu'un.

Est-il possible de détecter la fermeture de la fenêtre ouverte "Windows" afin de retourner à 1360x768 lorsque la fenêtre se ferme ?

Merci par avance smile

Dernière modification par VincentR (Le 07/11/2015, à 17:09)

Hors ligne

#2 Le 06/11/2015, à 21:06

pingouinux

Re : [Résolu] Détecter la fermeture d'une fenêtre

Bonsoir,
As-tu essayé de placer dans ton script une autre commande xrandr entre VBoxManage et exit ?

Hors ligne

#3 Le 06/11/2015, à 21:10

VincentR

Re : [Résolu] Détecter la fermeture d'une fenêtre

Oui, la résolution passe à 1920x1080 puis Windows se lance puis la résolution retourne instantanément à 1360x768...

Dernière modification par VincentR (Le 06/11/2015, à 22:49)

Hors ligne

#4 Le 07/11/2015, à 09:20

serged

Re : [Résolu] Détecter la fermeture d'une fenêtre

AS-tu pensé à installer les "Additions invité" dans la machine Windows ? Elles te permettent d'afficher la machine Windows à la résolution de la fenêtre dans laquelle elle tourne.


LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)

Hors ligne

#5 Le 07/11/2015, à 13:06

VincentR

Re : [Résolu] Détecter la fermeture d'une fenêtre

Oui, normalement j'ai installé toutes les additions invité.
Windows prend la résolution d'Ubuntu. C'est pour cela que je change la résolution à 1920x1080 avant de lancer virtualbox.
Serait-il possible d'utiliser une sorte de "tant que" sur la ligne " VBoxManage startvm "Windows 8.1"  "?
"Tant que Vbox est actif, ne pas exécuter la suite du script..."

Hors ligne

#6 Le 07/11/2015, à 14:11

Elzen

Re : [Résolu] Détecter la fermeture d'une fenêtre

Salut,

c'est possible, oui ; mais ça peut parfois être un poil compliqué smile

En temps normal, le shell attend la fin de la commande actuellement lancée avant de passer à la suite, donc la solution proposée par pingouinux va marcher dans pas mal de cas. Cependant, un certain nombre d'applications ont des commandes non-bloquantes, parce que l'information est seulement transmise à un autre processus. Ça semble être le cas de « VBoxManage » (qui doit communiquer avec un autre processus de VirtualBox), d'où le fait que la résolution revienne immédiatement.

La solution que tu proposais de détecter la fermeture de la fenêtre est un bon moyen de contourner ce soucis. Tu peux faire ça directement en shell, en utilisant par exemple l'outil « wmctrl » (il n'est pas installé par défaut, mais présent dans le paquet du même nom).
Une fois ce programme installé, la commande « wmctrl -l » te permet de lister les fenêtres actives, et tu peux alors vérifier si celle qui t'intéresse est dedans. Tu peux alors obtenir ce que tu souhaites en rajoutant une boucle dans ton code, après le lancement de la machine virtuelle :

#! /bin/bash

xrandr -s 1920x1080
VBoxManage startvm "Windows 8.1"

while test "$(wmctrl -l | grep 'Le nom de ta fenêtre')" != ""
 do
    sleep 1
done

xrandr -s 1360x768
exit 0

À adapter selon les besoins, bien sûr.
Ce script utilise une attente active (vérification toutes les secondes de la présence de la fenêtre), donc il y aurait moyen de faire plus élégant en utilisant de l'événementiel ; mais ce serait vraisemblablement trop complexe par rapport à ce que ça t'apporterait.

Si tu as des questions sur ce bout de code, n'hésite pas à demander smile

(Oh, et, tu devrais peut-être changer le titre de ton topic, qui est présentement un peu trompeur : le but du script est de changer la résolution de l'écran ; mais le soucis ne vient pas de là, et pourrait être rencontré sur des scripts devant faire n'importe quoi d'autre à la fermeture de l'appli wink)

Hors ligne

#7 Le 07/11/2015, à 16:44

VincentR

Re : [Résolu] Détecter la fermeture d'une fenêtre

Merci pour ta réponse.

Dans le nom de la fenêtre, le numéro du type 0x03a00164 change à chaque ouverture/fermeture. Je ne sais pas comment tester seulement un morceau d'une chaîne de caractères.

J'ai essayé ceci :

#! /bin/bash

xrandr -s 1920x1080
VBoxManage startvm "Windows 8.1"
v='Oracle VM VirtualBox'
chaine=$(wmctrl -l | grep 'Oracle VM VirtualBox')
p="1"
while p="1"
do
	[[ "$chaine" =~ "$v" ]] && p="1" || p="0"
	sleep 1
done
xrandr -s 1360x768
exit 0

Mais j'ai l'impression que même une fois que p vaut 0, la boucle while continue...

Dernière modification par VincentR (Le 07/11/2015, à 16:45)

Hors ligne

#8 Le 07/11/2015, à 17:00

Elzen

Re : [Résolu] Détecter la fermeture d'une fenêtre

Oh, tu fais un peu trop compliqué, là smile

grep renvoie les lignes contenant la chaîne de caractères indiquée, donc

wmctrl -l | grep 'Oracle VM VirtualBox'

renverra toutes les lignes du résultat de wmctrl contenant « Oracle VM VirtualBox ». À moins que tu n'aies plusieurs VM (ou d'autres fenêtres ayant ça dans leur titre, ce qui est plutôt rare) affichées en même temps, ça devrait suffire amplement, et donc

#! /bin/bash

xrandr -s 1920x1080
VBoxManage startvm "Windows 8.1"

while test "$(wmctrl -l | grep 'Oracle VM VirtualBox')" != ""
 do
    sleep 1
done

xrandr -s 1360x768
exit 0

devrait faire l'affaire smile

Sinon, dans ton code, le soucis vient de cette ligne :

while p="1"

En effet, while vérifie le code de retour de l'instruction qui suit. Or, « p="1" » écrit comme ça est une affectation, qui renvoie donc toujours le même code.
Pour faire un test d'égalité, tu peux faire comme ça :

while test $p = "1"

(En n'oubliant pas le $ pour évaluer le contenu de la variable)

Hors ligne

#9 Le 07/11/2015, à 17:07

VincentR

Re : [Résolu] Détecter la fermeture d'une fenêtre

Ton code fonctionne, merci beaucoup smile

Dernière modification par VincentR (Le 07/11/2015, à 17:07)

Hors ligne