Capture de caractère
Franck7511
Messages postés
14296
Date d'inscription
Statut
Membre
Dernière intervention
-
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
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 !
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:
- Capture de caractère
- Caractère ascii - Guide
- Capture d'écran whatsapp - Accueil - Messagerie instantanée
- Caractère spéciaux - Guide
- Capture d'écran samsung - Guide
- Faststone capture - Télécharger - Capture d'écran
4 réponses
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 ;-)
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 ;-)
Salut,
J'ai Fedora 17 et gcc en compilateur.
Le code fait presque 1000 lignes :( mais en gros, ce qui plante c'est :
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"
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"
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().
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().
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/
Regarde par ici pour les fonctions ncurses : https://tldp.org/HOWTO/NCURSES-Programming-HOWTO/
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
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
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 !
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 !
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 :
Dal
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
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
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
Ah, et si tu mets
(il se peut que tu doives sortir de ta session X et la réinitailiser, ou faire
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
Mais vu que ta fenêtre est un terminal, envoyer des codes d'échappement est beaucoup plus simple.
Dal
xterm*allowWindowOps: truedans
~/.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.het 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