Capture de caractère

Fermé
Franck7511 Messages postés 14296 Date d'inscription jeudi 24 décembre 2009 Statut Membre Dernière intervention 10 août 2017 - 22 nov. 2013 à 13:26
[Dal] Messages postés 6193 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 juillet 2024 - 10 déc. 2013 à 12:01
Bonjour,

Je voudrais savoir s'il était possible de capturer "en temps réel" la saisie d'une touche au clavier à l'aide d'une fonction en C, si possible standard.

En gros, ça marche comme pour le manuel. Il suffit de presser q pour le quitter par exemple.

Aussi, j'aurais la même requete pour cette fois redimensionner une fenêtre, celle du terminal. J'ai utilisé ncurses.h et resizeterm mais ça bug à la compilation...



Merci !
A voir également:

4 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
22 nov. 2013 à 21:23
En standard il n'existe rien de tout ça.
Apres cela depend de ton OS ?
Et sil y a une erreur à la compil, cest que ton code est faux. Et pour le corriger, cest plus simple si tu nous le montres ;-)
1
Franck7511 Messages postés 14296 Date d'inscription jeudi 24 décembre 2009 Statut Membre Dernière intervention 10 août 2017 1 121
Modifié par Franck7511 le 23/11/2013 à 14:12
Salut,

J'ai Fedora 17 et gcc en compilateur.

Le code fait presque 1000 lignes :( mais en gros, ce qui plante c'est :


#include <ncurses.h>

(...)

int main (int argc, char * argv[])
{
(...)
int l = (...);
int h = (...);
resizeterm(l, h);
(...)
}

GCC me renvoie :

"/tmp/ccE0HnRh.o: In function 'main':
blabla.c:(.text+0x19): undefined reference to 'resizeterm'
collect2: erreur: ld a retourné 1 code d'état d'exécution"
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
23 nov. 2013 à 14:20
Lorsque tu compiles, as-tu rajouté l'option -l (L minuscule) ?
Il faut réaliser linker la bibliothèque libncurses : -lncurses (L minuscule).
0
Franck7511 Messages postés 14296 Date d'inscription jeudi 24 décembre 2009 Statut Membre Dernière intervention 10 août 2017 1 121
23 nov. 2013 à 14:25
J'avais oublié... merci !

Maintenant ça compile. Mais ça n'a aucune action.


#include <ncurses.h>

int main()
{
resizeterm(100,45);
printf("blabla");
return 0;
}


compile mais ne fait qu'imprimer blabla...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
23 nov. 2013 à 14:58
Je connais pas ncurses mais j'ai lu le man (il faut prendre cette habitude ;-)) :
Et cela dit : change the curses terminal size
Autrement cela ne changera pas ton terminal, mais celui de curses.
Pour créer une fenêtre curses : WINDOW * win = newwin(nlines, ncols, y0, x0);

Si tu veux vraiment redimensionner le terminal linux, tu dois pouvoir t'en sortir avec les fonctions de sys/ioctl.h mais pas aussi simple que resizeterm().
0
Franck7511 Messages postés 14296 Date d'inscription jeudi 24 décembre 2009 Statut Membre Dernière intervention 10 août 2017 1 121
23 nov. 2013 à 15:17
Merci !


Sinon, des idées pour la capture de caractère ?
J'ai une idée (sale cela dit) pour la capture du caractère Entrée, mais pour le reste...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
Modifié par fiddy le 23/11/2013 à 15:26
Tu as la fonction getch() pour la capture de caractères.
Regarde par ici pour les fonctions ncurses : https://tldp.org/HOWTO/NCURSES-Programming-HOWTO/
0
[Dal] Messages postés 6193 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 juillet 2024 1 089
Modifié par [Dal] le 9/12/2013 à 19:29
Salut Franck7511,

Pour ton problème de redimensionnement de la fenêtre d'émulation de terminal dans laquelle s'exécute ton programme dans ton environnement graphique Fedora, je voulais juste de donner une autre perspective...

J'imagine que tu utilises Gnome-terminal sous Fedora.

Si c'est cela, une piste peut être là https://help.gnome.org/users/gnome-terminal/stable/pref-profiles.html.en c'est à dire la création d'un profil d'exécution de Gnome-terminal, avec les paramètres qui te plaisent (notamment la taille du terminal que tu souhaites) et le lancement du terminal avec ce profil, avec, en argument, ton programme console.

Je n'ai pas de console Gnome sous la main pour tester cela, mais j'ai fait quelque chose de similaire sous Ubuntu il y a quelques temps.


Dal
0
Franck7511 Messages postés 14296 Date d'inscription jeudi 24 décembre 2009 Statut Membre Dernière intervention 10 août 2017 1 121
9 déc. 2013 à 21:36
Nope j'ai LXTerminal en fait. Et en fait il ne faut pas que je change de taille qu'une seule fois dans mon programme, mais plusieurs fois.

Je m'explique.

Je fais un démineur sur le terminal. Pour les grandes grilles, j'ai besoin d'agrandir la fenêtre... et vu qu'on peut rejouer, je dois pouvoir redimensionner !
0
[Dal] Messages postés 6193 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 juillet 2024 1 089
Modifié par [Dal] le 10/12/2013 à 10:51
Salut Franck7511,

Je ne connais pas ton émulateur de terminal "LXTerminal".

Cependant, il est possible qu'il reconnaisse les séquences d'échappement xterm.

Il y en a de nombreuses, et parmi ces séquences, il y en a qui permettent d'agir sur le dimensionnement.

https://invisible-island.net/xterm/ctlseqs/ctlseqs.html
(cherche "Resize the text area to given height and width in characters" dedans)

Voilà un exemple qui fonctionne chez moi avec Putty, qui est un émulateur de terminal xterm (je n'ai pas d'installation avec X sous la main, mais cela devrait fonctionner avec tout émulateur xterm). Ce code redimensionne la fenêtre Windows dans laquelle s'exécute l'émulateur de terminal, en fonction des séquences d'échappement envoyées par le programme exécuté dans cet émulateur :

#include <stdio.h>

/*
 * Programme de test de séquences d'échappement xterm
 */

int main(void)
{
    printf("Pressez enter pour maximiser\n");
    getchar();
    printf("\e[9;1t");

    printf("Pressez enter pour restaurer la "
            "taille avant maximisation\n");
    getchar();
    printf("\e[9;0t");

    printf("Pressez enter pour dimensionner "
            "en 60 colonnes x 10 lignes\n");
    getchar();
    printf("\e[8;10;60t");

    return 0;
}



Dal
0
Franck7511 Messages postés 14296 Date d'inscription jeudi 24 décembre 2009 Statut Membre Dernière intervention 10 août 2017 1 121
Modifié par Franck7511 le 10/12/2013 à 11:03
Salut,

Ce code ne redimensionne pas chez moi :/

J'ai aussi essayé printf("\e[10;1t"); pour le mode plein écran, sans succès.

Remarque, le plein écran me conviendrait aussi (ça enlèverait le problème de redimensionnement à chaque partie), s'il y a un moyen de faire ça simplement :)

J'ai vu ça sur Internet : https://ohse.de/uwe/software/resize.c.html mais à la compilation, y a une fonction qu'il n'apprécie pas trop... tparam de mémoire
0
[Dal] Messages postés 6193 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 juillet 2024 1 089
Modifié par [Dal] le 10/12/2013 à 11:41
Ah, et si tu mets
xterm*allowWindowOps: true
dans
~/.Xdefaults
?

(il se peut que tu doives sortir de ta session X et la réinitailiser, ou faire
xrdb ~/.Xdefaults
).

Sinon, je suis aussi tombé sur ce programme, qui permet de contrôler les fenêtres X pour des gestionnaires de fenêtres respectant la spécification EWMH (metacity pour Gnome et plein d'autres)

http://tomas.styblo.name/wmctrl/

Tu pourrais t'en servir pour identifier ta fenêtre et la redimensionner. Tu peux aussi télécharger ce programme et voir son code source, où on voit que la fonction window_move_resize utilise XResizeWindow (inclure
X11/Xlib.h
et linker avec
-lX11
) pour redimensionner les fenêtres X (après avoir obtenu l'information sur les fenêtres existantes via
XQueryTree
, etc.).

Mais vu que ta fenêtre est un terminal, envoyer des codes d'échappement est beaucoup plus simple.


Dal
0
[Dal] Messages postés 6193 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 4 juillet 2024 1 089
10 déc. 2013 à 12:01
en voyant les options de ligne de commande de lxterminal, tu devrais aussi pouvoir faire :

lxterminal --geometry=60x10 -e /chemin/vers/mon/programme
pour fixer la taille au lancement


Dal
0