EDIT 2009/04/13 (YYYY/MM/DD): Projet abandonné, utilisation déconseillée
EDIT 22 Août 2008: J'ai ouvert un nouveau sujet pour présenter la version 2.0.0. Si vous êtes intéressés, c'est par ici.
----------------------------------------------
Éditions:
EDIT 7 Août 2008: Je viens de me remettre au codage de la version 2.00.
La version actuellement disponible ( 1.03 ), décale tout ce qui est à l'écran lorsqu'on ouvre une zone de saisie.
Ce bug sera corrigé lorsque la version 2.00 sortira. En attendant, je retire les liens vers Badongo qui, de toutes façons, semble obliger les utilisateurs à payer pour télécharger...
EDIT 26 Juin 2008: Version 1.03 sortie. Voici les changements:
-Correction des noms de fichiers (SDL_input -> SDL_Input) qui causaient des problèmes aux utilisateurs à cause de la casse du "Input".
Tout ce qui a trait à la SDL_Input s'appelle maintenant SDL_Input.
-Correction du nombre d'octets alloués lors de l'allocation de SDL_Input->chaine (sizeof( SDL_Input->chaine ) -> sizeof( *SDL_Input->chaine )).
-Correction du bug qui plaçait un '\0' à l'endroit du curseur lors de l'appui sur entrée (ce qui coupait la chaîne si le curseur n'était pas à la fin de la chaîne).
-Correction des quelques avertissements que la version 1.02 donnait.
-Ajout de la version de la bibliothèque (SDL_INPUT_VERSION)
Autres nouveautés:
-Upload du tarball (Linux): RETIRÉ
-Upload du rarfile (Windows): RETIRÉ
Les éditions précédentes infos concernant les versions précédentes sont <lien url="http://www.siteduzero.com/forum-83-253457-2293856-saisir-du-texte-avec-sdl.html#r2293856">ici</lien> (pour ceux que ça intéresse )
Attention: Avec Windows, j'ai dû mettre le fichier de bibliothèque statique dans le dossier SDL de CodeBlocks (C:\Program Files\CodeBlocks\MinGW\SDL\lib chez moi) pour que ça fonctionne (le mettre dans le même dossier ne fonctionnait pas).
Attention 2: N'oubliez pas de "link'er" libSDL_Input.a au projet.
----
Les changements à venir sont:
-Texte défilant (définition d'un zone de largeur X pouvant contenir un texte plus long que X)
-Possibilité de définir la largeur et la hauteur de la zone de texte (SDL_Input->position.w/h)
-Des exemples (snippets) d'utilisation de la bibliothèque dans la documentation
-Faire la documentation au format html
-Possiblement ajouter la possibilité de copier/coller/couper en se servant du presse-papiers (à voir).
Nota: le projet prend maintenant le nom de SDL_Input.
La documentation est RETIRÉE, voir le lien dans ma signature pour la dernière version.
Le code source est RETIRÉ, voir le lien dans ma signature pour la dernière version.
il y a longtemps (très longtemps!), j'avais commencé une fonction de saisie pour la SDL (que j'ai probablement posté quelque part sur ce forum). Enfin, j'ai remarqué récemment que beaucoup de Zér0s cherchent à saisir du texte avec la SDL. J'ai donc déterré les vestiges perdus de ma fonction et je me suis mis en tête de la rendre potable.
Bref, c'est chose faite, ma petite bibliothèque de saisie en SDL fonctionne. J'ai encore beaucoup à faire dessus (les saisies multilignes ne sont pas encore gérées, je dois encore travailler sur la documentation des fonctions, etc.
Enfin, toujours est-il que je la mets à disposition des Zér0s qui souhaiteraient s'en servir.
La bibliothèque propose pas mal d'options intéressantes (enfin, selon moi ):
-La bibliothèque gère l'unicode, il n'y a donc pas de problème avec les claviers AZERTY\QWERTY et cie.
-Il est possible d'effacer la saisie avec [RETOUR ARRIERE] (backspace) ainsi qu'avec [SUPPR.] (del).
-Lors de l'effacement, la surface située sous la saisie est "restorée", c'est-à-dire que la fonction s'occupe elle-même de rafraîchir la zone de saisie.
-J'ai implémenté un curseur, qu'il est possible de positioner dans la saisie pour aller éditer les premières lettres sans pour autant devoir tout effacer (ce fut plus difficile que je ne l'aurais cru, mais ça fonctionne ).
-La fonction permet de définir quel fonction TTF utiliser (RenderUTF8_Solid, Shaded ou Blended)
-Possibilité d'arrêter une saisie et de la continuer plus tard (c'est-à-dire que la chaîne est conservée dans l'état ou elle était auparavant) ou bien, a contrario, de vider la chaîne et de reprendre de zéro.
L'utilisation de structures permet d'avoir plusieurs chaînes en mémoire en même temps et de les organiser comme bon vous semble
-Et plein d'autres choses que je vous laisse découvrir
Et surtout, surtout, ne vous gênez pas pour commenter le code: si mes fonctions sont trop longues, si certaines parties semblent obscures, inutiles, etc.
EDIT: Je vais me servir de cette réponse pour lister les changements apportés (puisque mon autre post est déjà trop long pour ma connexion Internet ):
EDIT 9 Juin 2008: La bibliothèque compile parfaitement, malgré quelques avertissements (warnings) concernant le signe de la chaîne de caractères. Cependant, ces avertissements sont nécessaires puisqu'il est uniquement possible de conserver des caractères accentués dans un tableau de "unsigned char". Pour ceux que ceci dérange, il vous suffit de suivre <lien url="http://www.siteduzero.com/tuto-3-10623-1-creer-des-bibliotheques-avec-code-blocks.html">l'excellent tuto de seb13 pour compiler la bibliothèque</lien>.
EDIT 4 Juin 2008: Apparement, le code fonctionne parfaitement. Rapellez-vous qu'avec le main() de test il faut appuyer sur la touche '1' pour voir la zone de texte apparaître (ahh, ces utilisateurs ).
EDIT 28 Mai 2008: Attention, un utilisateur m'a informé que la bibliothèque plantait. Je ne peux pas actuelleement tester, ayant réinstallé ma Linux (je n'ai pas pensé à installer SDL et SDL_ttf). En ce moment, je n'arrive pas à me connecter à Internet via mon modem (donc impossibilité de vérifier tout ça) (je suis sur un autre ordinateur en ce moment). Je crois que le problème vient de la différence d'encodage entre Linux et Windows. Désolé à tous du contre-temps .
EDIT 27 Mai 2008 (2): J'ai décidé d'utiliser des ancres vers mes autres posts pour rapetisser ce post. Dès que j'aurai une connexion Internet fonctionnelle sur ma Linux, je vais upload'er les fichiers sur un site d'upload (fichiers sources, fichier de bibliothèque .a, Documentation).
EDIT 27 Mai 2008: Et voici la documentation ! Attention, il est possible qu'il y ait quelques erreurs d'encodage dans les sources et d'autres problèmes de ce type, puisque je n'ai pas encore réussi à configurer mon modem sous Linux ce qui m'oblige à utiliser un autre ordinateur sous Windows (donc problèmes d'encodage etc).
EDIT 20 mai 2008: Version 1.02: il est maintenant possible d'afficher des caractères accentués.
EDIT 19 mai 2008: je sors maintenant la version 1.01! Même si j'ai encore plein d'idées d'améliorations et de choses à faire, j'espère que ça vous plaira.
Nouveautés de la version 1.01:
-Plus aucun arrêt du programme par la bibliothèque (sauf si vous le faites exprès). C'est-à-dire qu'il n'y a plus trace de "exit( -1 );" dans le code. Toutes les fonctions qui peuvent planter retourne maintenant un code d'erreur qu'il vous appartient de gérer.
-Les touches «Début» ('HOME') et «Fin» ('End') sont maintenant gérées
-Quelques fonctions ajoutées
-Meilleure gestion du "poll'ing"
-La bibliothèque est maintenant disponible sous forme de bibliothèque (fichier .a) [version Linux x86] (merci à seb13 pour son tuto sur le sujet )
19 mars 2008: Correction de l'erreur de compilation provoquée par le changement des noms des fichiers sans changer leur référence dans le code (le projet devrait compiler sans erreur maintenant). Si votre compilateur vous indique une/des erreurs, merci de me le signaler sur ce sujet ou via MP.
19 mars 2008: Bug découvert (et corrigé) qui n'empêchait pas la compilation, mais provoquait un buffer overflow lorsqu'on appelait saisirSDL la 2e fois.
20 mars 2008: Bug découvert (et corrigé) qui plantait le programme lorsque l'utilisateur tappait plusieurs touches par secondes tout de suite après avoir appellé saisirSDL(): le bug était dû au fait que la police de caractère (TTF_Font*) était déclarée dans le prototype de la fonction comme un pointeur constant ce qui, apparement, faisait planter TTF_SizeText(). Le pointeur n'est plus déclaré constant, mais ne sera pas modifié pas la fonction, ne vous en faites pas .
20 mars 2008: Bug découvert: le programme plantait dû à un oubli de ma part: j'avais oublié de réserver une case-mémoire pour le caractère de fin de chaîne ('\0'). Le programme plantait lorsqu'il essayait de libérer cette case donc (corrigé).
20 mars 2008: Bug découvert: Il pouvait arriver que le programme libère deux fois de suite le même emplacement mémoire, provoquant une erreur de segmentation.
20 mars 2008: Ajout: Remise systématique des pointeurs à NULL une fois libérés (corrige le bug ci-haut mentionné).
20 mars 2008: Bug découvert: Écrire du texte pour ensuite l'effacer en alternant "retour arrière" et "supprimer" provoquait une erreur de segmentation dûe à test (if) incomplet (corrigé).
20 mars 2008: Je n'ai pas réussi à faire replanter le programme. J'imagine donc que toutes les erreurs ont été corrigées.
@Fvirtman:
Merci de ton soutien !
J'espère surtout avec des commentaires/réponses (pour savoir quels points sont à améliorer).
Good Game Je voulais tenter de faire une fonction de saisie avec SDL mais la plus la peine (j'ai pas encore testé mais dés que je fait un projet sous SDL je teste )
Ça signifie pas d'erreur lors de la compilation ça?
Sinon, je ne considère pas le projet assez important pour faire une page web. Il faut d'abord que je termine. C'est-à-dire gérer la saisie multiligne ( définir un "message box" et "clip'per" l'affichage en fonction de ce rectangle), créer une documentation sous forme de pages html, gérer correctement les erreurs dans la bibliothèque (renvoi d'une valeur d'erreur plutôt qu'un simple exit( -1 )) et peut-être plus qui sait.
Enfin, merci de vos réponses, c'est plaisant de savoir que ça sera utile à quelqu'un .
/* Cela revient avec ton if, sauf que le test est fait une fois
* pour determiner quel est la fonction a appeler.
*/
GetEvent( &event );
...
}
...
}
En espérant que je ne me sois pas trompé. Je trouve simplement cela plus esthétique, niveau perf, j'en ai aucune idée ^^'. A vue de nez, je dirais que tu n'y perds pas.
Si j'ai bien compris ton exemple groscask, il s'agit en fait de créer un pointeur de fonction nommé GetEvent qui prend comme argument un pointeur sur "SDL_Event" (tout comme les deux fonctions SDL_WaitEvent() et SDL_PollEvent() ?
Déjà, si j'ai bien compris, ça reste pas clair pour moi: comment le compilateur sait-il qu'il s'agit d'une fonction et non pas d'une variable (puisque les parenthèses sont absentes)? Pourquoi ne pas plutôt faire &SDL_WaitEvent( NULL ) ?
Sauf pour atexit( ), je n'utilise pas les pointeurs de fonctions.
Déjà, si j'ai bien compris, ça reste pas clair pour moi: comment le compilateur sait-il qu'il s'agit d'une fonction et non pas d'une variable (puisque les parenthèses sont absentes)? Pourquoi ne pas plutôt faire &SDL_WaitEvent( NULL ) ?
Cela est dû à deux choses :
- Primo, la syntaxe de la déclaration un peu particulière :
int(*GetEvent)(SDL_Event *);
Vient de la priorité des opérateurs... Ce n'est donc là qu'une question de syntaxe et d'habitude au final.
- Secundo, le nom d'une fonction représente également son adresse en C. D'où l'absence du & classique. Note bien que cette syntaxe est également admise !
j'ai moi même créé ma lib pour faire des champ de saisie mais pour mes applications SDL/OpenGL
J'utilise les même fonctionnalités que les tiennes mais je vais rajouté la possibilité de selection et de Copier/Coller
puis je tenterais l'overflow (barre de défilement (gauche/droite) )
Si quelque veut les sources je veut bien les montrer
j'ai moi même créé ma lib pour faire des champ de saisie mais pour mes applications SDL/OpenGL
J'utilise les même fonctionnalités que les tiennes mais je vais rajouté la possibilité de selection et de Copier/Coller
puis je tenterais l'overflow (barre de défilement (gauche/droite) )
Si quelque veut les sources je veut bien les montrer
Edit : j'ai ajouter maintenant le défilement
PS: j'utilise la SDL (pas SFML) en C++
Hum, l'utilisation du "clipboard" m'intéresse. Est-ce que ton projet est portable ou bien utilise-t-il l'API Windows? Je serais curieux de connaître comment on envoie une chaîne à Klipper et associés (équivalents du Windows "clipboard").
Hum, ça m'a l'air hyper intéressant ça ! Je test et je te dis ce que j'en pense...
J'ai fait une fonction qui gère les menus en SDL, personnellement. Il faudrait un gros topic épinglé avec toutes les fonctions SDL crées par les membres pour se simplifier la vie ^^.
Oui c'est sûr faudrait en parler à un modérateur pour faire un sujet comme celui là
On pourrait y mettre plein de fonction SDL pour : gerer les menus, gerer les champs textes, gerer les grands champs de saisie, gerer les cases à cochers etc...
Edit (pas vu le message de vhann) : je suis en train de faire ma fonction Copier/Coller, j'ai fait ceci mais ça ne sera pas portable c'est ça le principale problème, faudrait avoir pour faire les mêmes fonctions avec un système Unix et MacOS
(La dernière réponse date d'il y a longtemps, mais je viens de la remarquer).
Maxima, je ne comprends pas pourquoi tu viens faire de la publicité pour ton code ici:
1- C'est en C++ alors que ce forum est un forum C.
2- Je remarque qu'il y aurait beaucoup à critiquer sur la fonction que tu as trouvé sur le net: (non-portable, utilisation de goto & labels)
Du fait que ta lib (sic!) soit en C++ et ma bibliothèque en C, elles sont toutes deux complémentaires et non en compétition -c'est l'impression que ta première *deuxième* réponse me laisse.
Donc, je crois que tu devrais plutôt poster pour ta bibliothèque dans le forum C++.
Je ne sais pas si mon projet en intéresse certains, mais les caractères accentués sont maintenant parfaitement gérés (et la compilation ne produit aucun warning).
Je n'en ai pas l'utilitée pour l'instant, mais ta lib pourrait m'être utile un jour ^^.
Par contre, tu devrai soit fournir le .a et un .h, soit fournir une archive avec les sources...
@gigotdarnaud: Les sources sont là (en secret pour ne pas encombrer la page). Pour le .a, il me faudrait un endroit (les sites comme megaupload sont peu fiables pour assurer la pérennité d'un lien de téléchargement). Je pense traduire la bibliothèque et la proposer sur le site de la SDL (on verra s'ils en veulent ou pas) une fois que j'aurais terminé la documentation.
@madmax02: Tu peux soit aller voir le tuto de seb13 dans Tutoriels->Non officiels->Programmation->C->Créer des bibliothèques avec Code::Blocks ou bien tu peux tout simplement créer des fichiers SDL_input.h, SDL_inputAfficher.c, SDL_inputGestion.c, les ajouter à tes projets, puis copier le code posté ici dedans.
Salut, j'ai un petit soucis, j'ai eu beau lire tout ton code, je n'arrive pas a récupérer la saisie dans un tableau de type char.
Donc j'ai éssayé
while (i <= 24)
{
info->nomGolf[i] = saisie->chaine[i];
i++;
}
mais je n'arrive a rien ...
le code plus approprié serait sûrement:
for( i = 0; saisie->chaine[ i ] != NULL; i++ ) {
info->nomGolf[ i ] = saisie->chaine[ i ];
}
En déclarant info->nomGolf comme étant une chaîne de unsigned char, ça devrait fonctionner (je ne suis pas sur le bon ordinateur, mais je tester pour être certain que ça fonctionne aussitôt que possible).
case SDL_KEYDOWN:
if( event.key.keysym.sym == SDLK_1 )
{
erreur = SDL_InputSaisir( saisie, ecran, police, &couleurTexte,
&couleurFond, SDL_INPUT_FOND_UNI, 1 );
fprintf(stderr, "erreur = %ld", erreur);
for( i = 0; saisie->chaine[ i ] != NULL; i++ )
{
info->nomGolf[ i ] = saisie->chaine[ i ];
}
SDL_Flip(ecran);
}
break;
voilà apparemment j'entre pas dans la boucle d'event car mon fichier stderr ne se rempli pas lorsque j'appuye sur une touche alors que tout les autres evenements fonctionnent
EDIT :
J'ai trouvé l'erreur, elle vient du main que tu fournis
tu as écrit :
if( event.key.keysym.sym == SDLK_1 )
au lieu de :
if( event.key.keysym.sym )
Sans ca, mon code marche a la perfection
EDIT2 :
Voilà que je rencontre a nouveau un probleme, a chaque fois que je presse la touche entrée, (suivez bien ^^) ma fenêtre ne bouge pas mais ce qui est a l'interieur se déplace en bas a droite, ce qui fait que ce qui est en bas a droite disparait de l'écran ... J'ai en fait éssayé de modifier la position du texte mais je trouve pas la bonne variable =D
"if( event.key.keysym.sym == SDLK_1 )" c'est pour ne pas activer la saisie à chaque frappe de touche (quand on "debug", ça va mieux comme ça ).
Sinon, pour modifier l'emplacement du texte, c'est [structure SDL_Input]->position.x ( et/ou .y ).
Pour le reste, je ne crois pas que le problème soit dû à ma bibliothèque.
P.S.: Oui, je sais, il manque une documentation pour tout ça parce que là vous devez parcourir mon code pour pouvoir l'utiliser, mais c'est long et ennuyant écrire une doc (ok ok, je m'y mets ).
mais ca bug toujours, l'interieur de l'écran se déplace en bas a droite donc tout se décale , mon champ d'écriture est la ou je veux mais le reste du texte s'enfuit donc voilà. Sinon merci pour cette bibliothèque
Simple question(désolé si quelqu'un l'a deja écris/demandé), y-a-til un moyen de récuperer dans un bete tableau de char de la fonction main la chaine écrite avec ce code?
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html