#1 Le 02/05/2008, à 20:33
- t!m
comment reprendre la main lors du lancement d'evince en shell ?
bonjour,
je suis en train d'essayer de coder un petit script qui lit une entrée clavier et ouvre une image prédéfini en plein écran , en attendant la prochaine entrée clavier...
le probleme est de reprendre la main apres l'ouverture de l'image (grace a evince en mode presentation)
voici mon bou de script:
#!/bin/sh
while :
do
./attd#lit un entree clavier et recopie dans un fichier txt nomme img l'image a afficher corespondant a l'entrée clavier
var=$(cat img)
#nom de l'image a afficher
echo $var
killall evince
evince -s $var &
done
le probleme est que une fois evince ouvert, la terminal n'a plus la main et ne peut alors pas recevoir d'entrée clavier, ce qui freeze le programme (./attd comme son nom l'indique, attd une entrée clavier pour continuer son execution....)
merci de votre aide
t!m:/
#2 Le 02/05/2008, à 21:10
- thy
Re : comment reprendre la main lors du lancement d'evince en shell ?
une fois evince ouvert ton terminal n'a plus le focus, c'est evince qui l'a.
c'est donc normal que plus rien ne se passe une fois evince ouvert.
Ton script ne capturera pas les entrées clavier si le terminal dans lequel tu lance ton script n'est pas au premier plan
Le script shell me parait pas très approprié pour faire ce que tu veux faire.
Enfin faut voir, peut être pourrais tu donner plus de détails sur ce que tu veux faire.
Hors ligne
#3 Le 02/05/2008, à 21:15
- t!m
Re : comment reprendre la main lors du lancement d'evince en shell ?
au final le code doit lire un nombre sur le port série et ouvrir l'image correspondante en pleine écran.
Toutes les images sont stokées dans le repertoire local.
tant qu'un autre nombre n'est pas reçu, l'image doit rester afficher.
voila exactement ce doit faire le code ....
que me conseillerais tu alors ?
#4 Le 02/05/2008, à 22:08
- thy
Re : comment reprendre la main lors du lancement d'evince en shell ?
En fait le problème que tu rencontre viens uniquement du fait que tu lis sur le clavier
Si tu arrive à lire le port série en shell ça devrait le faire.
un lien que j'ai trouvé a ce sujet :
http://www.developpez.net/forums/showthread.php?t=2769
Hors ligne
#5 Le 02/05/2008, à 22:29
- t!m
Re : comment reprendre la main lors du lancement d'evince en shell ?
ok je l'avais deja lu ce topic la !!
je me lance dans les essais, on verra bien ce que cela va donner !
#6 Le 02/05/2008, à 22:36
- t!m
Re : comment reprendre la main lors du lancement d'evince en shell ?
ok !!
ca a l'air de marcher !!!
pour ceux que cela pourrait interresser demander le code !!
merci pour ton aide, thy !
#7 Le 02/05/2008, à 22:38
- thy
Re : comment reprendre la main lors du lancement d'evince en shell ?
De rien,
ça m'intérrèsse.
ça m'interrèsse aussi de savoir à quoi ça te sert.
Hors ligne
#8 Le 02/05/2008, à 23:02
- t!m
Re : comment reprendre la main lors du lancement d'evince en shell ?
Je travaille sur une expérience autonome pour un musée : le Pc me sert a afficher des explications sur le deroulement de l'expérience, qui est gérée par un PIC .
en fait c'est expérience de diffraction d'un laser, que tu peut modeliser par un projecteur de diapositive...
grosso modo tu affiche la diapo et le commentaire correspondant apparait a l'écran du PC..
j'ai un peu honte , code resultant est vraiment simplet...
#!/bin/sh
echo "on commence"
while :
do
./reception
killall evince
var=$(cat img)
evince $var &
done
reception.c :
#include <termios.h>
#include<stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int srl_handle;
main()
{
struct termios options;
srl_handle = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
if (srl_handle < 0)
{
perror("Erreur lors de l'ouverture du port serie\n");
return -1;
}fcntl(srl_handle, F_SETFL, 0);
tcgetattr(srl_handle, &options);
cfsetospeed(&options, B115200);options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;/* mode RAW, pas de mode canonique, pas d'écho */
options.c_iflag = IGNBRK;options.c_lflag = 0;
options.c_oflag = 0;/* 1 caractère suffit */
options.c_cc[VMIN] = 1;/* Donnée disponible immédiatement */
options.c_cc[VTIME] = 0;/* Inhibe le contrôle de flux XON/XOFF */
options.c_iflag &= ~(IXON | IXOFF | IXANY);tcsetattr(srl_handle, TCSANOW, &options);
FILE *f;
int x=0;
f=fopen("img","w");
while(x==0){read(srl_handle, &x, 1);}
fprintf(f,"d%d.pdf",x);
fclose(f);
close(srl_handle)}
aux erreurs de recopie pres!
les images sont stockées dans le repertoire courant sout le nom d*.pdf où * est un entier...