#1 Le 08/12/2023, à 17:28
- alrito
[Résolu] Bash : Attendre un processus de fin d'un jeu sous wine
Bonjour,
J'ai un fichier desktop contenant ceci en section Exec :
Exec=env WINEPREFIX="/home/alrito/.wine" wine C:\\\\Utilisateurs\\\\Public\\\\Bureau\\\\Syberia.lnk ; xdotool selectwindow windowunmap ; xrandr --output DP-1 --mode 1920x1080
Les deux commandes "xdotool...." et "xrandr...." sont le fruit de deux discussions que voici :
[Résolu] Problème de pleine écran avec Sybéria sous Wine
[Résolu] Résolution d'écran modifier lorsque je quitte un jeu
Le problème est le suivant :
Le jeu se lance en 800x600 et s'affiche bien en pleine écran en utilisant xdotool mais c'est remis en 1920x1080, ce qui me fait un écran tout rikiki en haut à gauche.
Chose à voir :
Je voudrais donc que le script se lance jusqu'à xdotool et quand je quitte le jeu, ça lance xrandr.
Comment fait-on ?
alrito
Dernière modification par alrito (Le 17/12/2023, à 13:19)
Je dirais que le secret pour résoudre un problème, c'est de la patience. On y arrive :)
Hors ligne
#2 Le 08/12/2023, à 18:00
- kamaris
Re : [Résolu] Bash : Attendre un processus de fin d'un jeu sous wine
Étonnant que ça marche avec des points-virgules dans la ligne Exec=, il doit y avoir un interpréteur qui prend le relais implicitement.
Étonnant aussi que wine rende la main avant la fin de l'exécution du jeu.
Quoi qu'il en soit tu peux essayer d'intercaler un pwait wine (ou pidwait wine selon ce qui est installé sur ta machine) entre xdotool et xrandr.
Hors ligne
#3 Le 08/12/2023, à 19:21
- alrito
Re : [Résolu] Bash : Attendre un processus de fin d'un jeu sous wine
Celui qui est installé c'est pidwait pour mon système en tout cas et je viens de tester ceci :
Exec=env WINEPREFIX="/home/alrito/.wine" wine C:\\\\Utilisateurs\\\\Public\\\\Bureau\\\\Syberia.lnk ; xdotool selectwindow windowunmap ; pidwait wine ; xrandr --output DP-1 --mode 1920x1080
Je me retrouve sans xdotool donc pas d'affichage et si je mets : "pidwait xdotool", je me retrouve avec la petite fenêtre en haut à gauche.
Je dirais que le secret pour résoudre un problème, c'est de la patience. On y arrive :)
Hors ligne
#4 Le 08/12/2023, à 19:51
- ylag
Re : [Résolu] Bash : Attendre un processus de fin d'un jeu sous wine
Bonsoir,
Au risque de dire une grosse bêtise, faudrait-il scinder la ligne Exec= en deux parties, une ExecStart= servant à lancer le jeu, et une ExecStop= qui servirait à ramener l'affichage à la résolution voulue à la fermeture de ce dernier, si la fonction ExecStop= peut être utilisée à cette fin ?
A+
Dernière modification par ylag (Le 08/12/2023, à 19:58)
Hors ligne
#5 Le 08/12/2023, à 20:07
- kamaris
Re : [Résolu] Bash : Attendre un processus de fin d'un jeu sous wine
Au risque de dire une grosse bêtise, faudrait-il scinder la ligne Exec= en deux parties, une ExecStart= servant à lancer le jeu, et une ExecStop= qui servirait à ramener l'affichage à la résolution voulue à la fermeture de ce dernier, si la fonction ExecStop= peut être utilisée à cette fin ?
Ce serait bien mais malheureusement ces clefs n'existent pas dans la spécification des fichiers desktop.
Donc à moins que KDE l'implémente hors spec…
Sinon je trouve le comportement que tu obtiens assez bizarre alrito, on dirait que les points-virgules sont interprétés comme des '&' dans ce contexte…
Personnellement, pour y voir clair, je commencerais par mettre tout ça dans un script, et appeler le script (et seulement le script) depuis le fichier desktop.
Donc pour le script ça donnerait
#!/bin/bash
WINEPREFIX='/home/alrito/.wine' wine 'C:\\Utilisateurs\Public\Bureau\Syberia.lnk' &
xdotool selectwindow windowunmap
wait
xrandr --output DP-1 --mode 1920x1080
Puis dans le fichier desktop
Exec=/chemin/vers/script
en oubliant pas de rendre le script exécutable:
chmod u+x /chemin/vers/script
Dernière modification par kamaris (Le 08/12/2023, à 20:10)
Hors ligne
#6 Le 08/12/2023, à 21:01
- alrito
Re : [Résolu] Bash : Attendre un processus de fin d'un jeu sous wine
J'ai fait un copier/coller de ton script dans "~/.local/bin" comme ça, il est executable directement sans spécifier le chemin.
Je l'ai nommé Syberia puis je lui ait rendu la priorité d'excéution. Je l'ais lancé d'abord depuis "~/.local/bin" et j'ai le même résultat problématique.
Même en l'exécutant dans le fichier desktop :
Exec=Syberia
Même problème.
Je dirais que le secret pour résoudre un problème, c'est de la patience. On y arrive :)
Hors ligne
#7 Le 08/12/2023, à 21:46
- kamaris
Re : [Résolu] Bash : Attendre un processus de fin d'un jeu sous wine
Je ne comprends pas désolé.
Si j'exécute quelque chose avec wine à la place de ton jeu dans ce script, j'ai bien le comportement attendu :
* wine se lance en arrière plan;
* xdotool attend que je clique sur une fenêtre pour la "cacher" (unmap);
* wait attend que wine se termine d'une manière ou d'une autre;
* le script continue.
Comme je ne peux pas tester exactement ton cas d'utilisation, je ne pense pas pouvoir faire mieux
Dernière modification par kamaris (Le 08/12/2023, à 21:48)
Hors ligne
#8 Le 08/12/2023, à 22:47
- alrito
Re : [Résolu] Bash : Attendre un processus de fin d'un jeu sous wine
* xdotool attend que je clique sur une fenêtre pour la "cacher" (unmap);
C'est à ce moment là que ça coince.
Quand xdotool se déclenche, j'ai bien la fenêtre du jeu en noir avec le curseur symbolisé de xdotool et quand je clique avec la souris et bien je me retrouve avec la petite fenêtre en haut à gauche.
Je dirais que le secret pour résoudre un problème, c'est de la patience. On y arrive :)
Hors ligne
#9 Le 08/12/2023, à 23:09
- kamaris
Re : [Résolu] Bash : Attendre un processus de fin d'un jeu sous wine
Alors peut-être que le processus du jeu est "reparenté", de sorte que wait ne le voit pas, ce qui expliquerait pourquoi wine rend la main avec un point-virgule plus haut.
Tu peux essayer de chercher dans un gestionnaire des tâches comment s'appelle le processus de ton jeu lorsqu'il s'exécute, et remplacer wait par pidwait nom-du-processus dans le script.
Dernière modification par kamaris (Le 08/12/2023, à 23:10)
Hors ligne
#10 Le 08/12/2023, à 23:15
- Watael
Re : [Résolu] Bash : Attendre un processus de fin d'un jeu sous wine
je ne suis pas familier des environnements graphiques, cependant je plussoie ExecStart/Stop; ça me fait penser à systemd.
on peut être plus explicite avec wait et lui indiquer le PID à attendre. cf. help wait.
Dernière modification par Watael (Le 10/12/2023, à 16:36)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#11 Le 10/12/2023, à 16:22
- alrito
Re : [Résolu] Bash : Attendre un processus de fin d'un jeu sous wine
Sur les pid que j'ai relevé, Syberia.exe, c'est "1" comme numéro de pid sauf que ce "1" et identique avec d'autres processus.
Donc en faite quand je fait pidwait Syberia.exe, il va me faire la même chose que comme si j'avais rien fait.
En gros :
Le jeu se lance, j'ai bien l'écran noir agrandi en 800 x 600 avec le curseur logo de xdotool et quand je clique, l'écran s'efface et réapparait en plus petit car il l'a pris la résolution en 1920x1080 avec xrandr.
Et ce que je voudrais dans tous ça c'est quand je suis dans l'écran noir avec mon curseur logoté de xdotool, je clique et je suis dans ma fenêtre en plein écran en 800x600 et quand je quitte le jeu, xrandr se déclenche et me voilà
de retour dans le bureau avec ma résolution normal en 1920x1080.
Je dirais que le secret pour résoudre un problème, c'est de la patience. On y arrive :)
Hors ligne
#12 Le 10/12/2023, à 17:23
- kamaris
Re : [Résolu] Bash : Attendre un processus de fin d'un jeu sous wine
Tu as regardé le pid parent et non le pid du processus lui-même, mais ça confirme ce que je pensais plus haut : le jeu a été reparenté à init (qui est le processus de pid 1).
Essaie ça comme commande pidwait dans le script:
pidwait -if syberia
EDIT: il faudrait aussi que tu renommes le script en ne mettant pas syberia dans son nom (avec ou sans majuscules), ça simplifierait les tests au moins dans un premier temps (sinon le script va s'attendre lui-même indéfiniment).
Dernière modification par kamaris (Le 10/12/2023, à 17:32)
Hors ligne
#13 Le 10/12/2023, à 17:37
- alrito
Re : [Résolu] Bash : Attendre un processus de fin d'un jeu sous wine
C'est pareil, ça va directement sur xrandr.
Je dirais que le secret pour résoudre un problème, c'est de la patience. On y arrive :)
Hors ligne
#14 Le 10/12/2023, à 17:46
- kamaris
Re : [Résolu] Bash : Attendre un processus de fin d'un jeu sous wine
Est-ce que tu peux exécuter cette commande quand le jeu est en cours d'exécution et donner son retour:
pgrep -a -P 1 .
Hors ligne
#15 Le 10/12/2023, à 18:04
- alrito
Re : [Résolu] Bash : Attendre un processus de fin d'un jeu sous wine
Le voici :
67606 C:\Program Files (x86)\Microids\Syberia\Syberia.exe
Je dirais que le secret pour résoudre un problème, c'est de la patience. On y arrive :)
Hors ligne
#16 Le 10/12/2023, à 18:16
- kamaris
Re : [Résolu] Bash : Attendre un processus de fin d'un jeu sous wine
Alors la commande pidwait donnée en #12 devrait le trouver et l'attendre.
Difficile de t'aider plus sans pouvoir tester.
Personnellement, pour débugueur, je remplacerais pidwait par pgrep dans le script pour voir ce qu'il retourne (il devrait renvoyer le pid du jeu).
Il faut peut-être attendre un peu après xdotool (avec la commande sleep) pour que le jeu soit reparenté et que pidwait puisse le trouver sous son pid final, mais ça me parait bizarre.
Dans son principe, le script donné plus haut devrait marcher en tout cas, il doit falloir ajuster un peu…
Dernière modification par kamaris (Le 10/12/2023, à 18:17)
Hors ligne
#17 Le 15/12/2023, à 15:25
- alrito
Re : [Résolu] Bash : Attendre un processus de fin d'un jeu sous wine
J'ai résolu le problème en créant une boucle while en utilisant la technique de geenux dans la discussion #4 à ce fil : [Résolu] : [Bash] Attendre la fin d'un processus
J'ai procéder comme suit :
Création du script placé dans ~/.local/bin/attente-syberia.sh :
#!/bin/bash
while [ $(pgrep "Syberia.exe") != "" ];do
sleep ;
done
Puis dans le fichier desktop de Syberia sur le bureau :
Exec=env WINEPREFIX="/home/allan/.wine" wine C:\\\\users\\\\Public\\\\Desktop\\\\Syberia.lnk ; xdotool selectwindow windowunmap ; attente-syberia.sh ; xrandr --output DP-1 --mode 1920x1080
Et maintenant, quand je lance le jeu, il se lance, je clique; il reste bien en grand écran (800x600) et quand je quitte, je suis sur mon bureau d'origine en 1920x1080.
Merci quand même à kamaris, ylag et Watael pour vos tuyaux
Je dirais que le secret pour résoudre un problème, c'est de la patience. On y arrive :)
Hors ligne
#18 Le 15/12/2023, à 16:00
- Watael
Re : [Résolu] Bash : Attendre un processus de fin d'un jeu sous wine
#!/bin/bash
until pgrep -i syberia.exe &>/dev/null; do sleep; done
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#19 Le 15/12/2023, à 16:12
- kamaris
Re : [Résolu] Bash : Attendre un processus de fin d'un jeu sous wine
Étrange que pgrep trouve des processus que pidwait ne trouve pas.
Ces commandes sont censées différer dans le traitement qu'elles font du résultat de la recherche, pas dans la recherche elle-même.
Je serais curieux de savoir pourquoi pidwait ne fonctionne pas ici.
Hors ligne