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 08/12/2023, à 18: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, à 14:19)


Carte mère : Gigabyte B365-HD3 - Processeur : Intel Core I5 - Ram : 8 Go - Disque dur : SSD nvme 1 T - Système d'exploitation : Kubuntu 22.04 - Emulateur divers : Winehq (9.0), Epsxe

Hors ligne

#2 Le 08/12/2023, à 19: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, à 20: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.


Carte mère : Gigabyte B365-HD3 - Processeur : Intel Core I5 - Ram : 8 Go - Disque dur : SSD nvme 1 T - Système d'exploitation : Kubuntu 22.04 - Emulateur divers : Winehq (9.0), Epsxe

Hors ligne

#4 Le 08/12/2023, à 20: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, à 20:58)

Hors ligne

#5 Le 08/12/2023, à 21:07

kamaris

Re : [Résolu] Bash : Attendre un processus de fin d'un jeu sous wine

ylag a écrit :

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, à 21:10)

Hors ligne

#6 Le 08/12/2023, à 22: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.


Carte mère : Gigabyte B365-HD3 - Processeur : Intel Core I5 - Ram : 8 Go - Disque dur : SSD nvme 1 T - Système d'exploitation : Kubuntu 22.04 - Emulateur divers : Winehq (9.0), Epsxe

Hors ligne

#7 Le 08/12/2023, à 22: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 hmm

Dernière modification par kamaris (Le 08/12/2023, à 22:48)

Hors ligne

#8 Le 08/12/2023, à 23:47

alrito

Re : [Résolu] Bash : Attendre un processus de fin d'un jeu sous wine

kamaris a écrit :

* 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.


Carte mère : Gigabyte B365-HD3 - Processeur : Intel Core I5 - Ram : 8 Go - Disque dur : SSD nvme 1 T - Système d'exploitation : Kubuntu 22.04 - Emulateur divers : Winehq (9.0), Epsxe

Hors ligne

#9 Le 09/12/2023, à 00: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 09/12/2023, à 00:10)

Hors ligne

#10 Le 09/12/2023, à 00: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, à 17:36)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#11 Le 10/12/2023, à 17: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.


Carte mère : Gigabyte B365-HD3 - Processeur : Intel Core I5 - Ram : 8 Go - Disque dur : SSD nvme 1 T - Système d'exploitation : Kubuntu 22.04 - Emulateur divers : Winehq (9.0), Epsxe

Hors ligne

#12 Le 10/12/2023, à 18: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, à 18:32)

Hors ligne

#13 Le 10/12/2023, à 18:37

alrito

Re : [Résolu] Bash : Attendre un processus de fin d'un jeu sous wine

C'est pareil, ça va directement sur xrandr.


Carte mère : Gigabyte B365-HD3 - Processeur : Intel Core I5 - Ram : 8 Go - Disque dur : SSD nvme 1 T - Système d'exploitation : Kubuntu 22.04 - Emulateur divers : Winehq (9.0), Epsxe

Hors ligne

#14 Le 10/12/2023, à 18: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, à 19: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 

Carte mère : Gigabyte B365-HD3 - Processeur : Intel Core I5 - Ram : 8 Go - Disque dur : SSD nvme 1 T - Système d'exploitation : Kubuntu 22.04 - Emulateur divers : Winehq (9.0), Epsxe

Hors ligne

#16 Le 10/12/2023, à 19: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, à 19:17)

Hors ligne

#17 Le 15/12/2023, à 16: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 wink


Carte mère : Gigabyte B365-HD3 - Processeur : Intel Core I5 - Ram : 8 Go - Disque dur : SSD nvme 1 T - Système d'exploitation : Kubuntu 22.04 - Emulateur divers : Winehq (9.0), Epsxe

Hors ligne

#18 Le 15/12/2023, à 17: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, à 17: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