IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

mini-éditeur de texte [ioctl Linux].


Sujet :

C

  1. #1
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut mini-éditeur de texte [ioctl Linux].
    Salut les C,
    En me servant du module ioctl j'ai créer un mini-éditeur de texte en mode terminal dont le concept est simple:
    - Je récupères la taille du terminal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    short size[4] ;
    ioctl(0,TIOCGWINSZ,&size) ;
    printf("width: %i height: %i",size[1],size[0]) ;
    -Puis je boucle afin de créer un espace pour entré du texte.
    -Je repositionne le curseur en haut a gauche après l'affiche du texte de bienvenue qui indique la touche a taper ('$' ) pour sortir, suite a quoi on peut choisir de sauver le texte dans un fichier ou quitter sans sauvegarder.
    -J'utilise simplement getchar() (est ce la bonne méthode a cet effet ?) en boucle pour récupérer les données taper avec des structures conditionnels pour le contrôle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    int char_counter=0 ;
    char text_buf[65535] ;
    int c ;
    int cols_count, line_count ;
    cols_count = line_count = 0 ;
    while ((c=getchar()) != '$' ) {
      if (c == ' \n') {
         line_count++ ;
         cols_count=0 ;
        }
       else {
         cols_count++ ;
       }
       text_buf[char_counter]=c ;
       char_counter++ ;
     }
    Cela fonctionne parfaitement avec le défaut que si le caractères '$' est contenue dans la ligne le programme réagit comme si vous vouliez quitter, le programme est un peu plus sophistiquer mais ça ne vole pas haut.
    Bref le sujet du terminal et son contrôle me passionne et j'aimerai améliorer mon programme et j'ai commencer par essayer de pouvoir rendre l'éditeur de texte navigable avec des séquences de codes de la page man console_codes.
    J'arrive a changer le curseur de place, avec soit:
    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("\x1B[A") , printf("\x1B[B") , printf("\x1B[C") , printf("\x1B[D") ;
    ou avec les coordonnées:
    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("\x1B[%i;%iH",cols_count,line_count) ;
    Le problème étant l'affichage des des séquences: ^[[A, ^[[B, ^[[C, ^[[D.
    dont je doit récupérer les caractères dans un tableau et valider avec la touche enter dont un bloc if exécute une des séquences printf(...) présenter plus haut.
    Ce n'est pas gagner...!!!

    je pourrai me servir du pavé numérique mais l'idée me plais pas même si c'est une solution et que j'utilise bien le caractères '$' pour sortir.
    Je ne sais si je peut utiliser les signaux comme nano pour afficher un menu.
    Je cherche de la documentation, des infos, des conseils sur le sujet mais Google ne me mène a rien et les pages man ne disent pas tout, le sujet est certainement vaste tout comme le C comme j'ai remarquer.

    Si vous avez des idées, infos, conseils, liens, a me donner je vous serai grandement reconnaissant.

    Merci pour vos réponses éclairés.

  2. #2
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 528
    Points
    3 528
    Par défaut
    Si je me souviens bien du projet de shell que j'ai eu...

    Les touches fléchées sont en fait une combinaison de 3 touches.
    Par exemple left arrow s'écrit ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ar[0] = 27;
    ar[1] = 91;
    ar[2] = 68;
    Suffit de faire un write de 3 et de mettre ça.

    Right : ar[2] = 67;Je ne me souviens plus de comment j'avais extrais tout ça, mais c'est déjà une piste d'analyse avec ton getchar si le 1er char est un 27 ou pas

    EDIT : intéresse-toi aussi au terminal en mode canonique ! et ne pas oublier de le remettre dans l'ancien mode après...

  3. #3
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Bonsoir,

    poutquoi utiliser les ioctl plutôt que l'interface de la libc, ou mieux la bibliothèque ncurses ?

    Sinon, comme indiqué par Metalman, regarde la partie sur les modes canoniques/non canoniques ; je pense que le mode non canonique est intéressant dans ton cas (raw mode avec les ioctl ???).

  4. #4
    Membre chevronné
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    855
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 855
    Points : 2 177
    Points
    2 177
    Par défaut
    En fait il faudrait même faire des read de 5 pour être exact si je me souviens bien car certaines touches envoient 5 caractères. Le mode canonique me semble être une bonne idée car il permet d'avoir un meilleur contrôle sur l'entrée standard (gestion de certaines touches comme les flèches ou d'autres dont nous ignorons parfois jusqu'à l'existence ).

    Par contre je rejoins l'avis de kwariz : pourquoi ne pas directement utiliser la ncurses ? Ça te faciliterait sacrément la vie !

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 163
    Points
    17 163
    Par défaut
    Autre conseil, jette un œil du coté de nano, qui est lui aussi écrit en C.

  6. #6
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    Merci pour vos réponses,
    j'ai effectuer le même traitement que Metalman récupérer les touches codes des touches fléchés (avec un tableau et les codes) mais le problème est l'affichage de celles-ci pendant qu'on tape des caractères de codes 27 91 [65|66|67|68]:
    il faut peut-être utiliser une autre méthode afin que ces caractères ne s'affiche pas:
    extrait de man console_codes :
    ESC [ 4 h
    DECIM (inactif par défaut) : Mode d'insertion.
    ???
    par exemple empêcher tout caractères de s'afficher et donc de filtrer la stdin et de n'écrire que ce qui n'est pas filtrer mais je ne vois pas comment: peut-être utiliser une autre méthode que de la famille des get() pour récupérer les caractères ?

    Concernant ncurse je ne sais ce que sais mais je vais m'informer, merci pour le conseil et essayer de comprendre un peu du code nano ( de Coreutils ? ).

    Merci pour vos réponses.

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 163
    Points
    17 163
    Par défaut
    Non, nano est un paquet autonome.

    Bonne continuation!

  8. #8
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 528
    Points
    3 528
    Par défaut
    Tu dois passer en mode non-canonique, lire le caractère que l'utilisateur t'envoie (read de 1 "malheureusement")... et faire une action avec... comme transmettre la flèche également.
    C'est le terminal qui interprétera ça car le code commence par 27.

    Pour revenir en début de ligne, c'est CR \r (retour chariot), pour descendre exactement en dessous c'est NL \n... donc c'est Windows qui a "raison" de mettre ses \r\n pour revenir en début de ligne et passer à celle en dessous (en gros gros).
    Pour effacer le caractère précédent, BS BackSpace (espace arrière)...

    Bon il y en a beaucoup comme ça... à chercher ! xD

    Pour les signaux, tu dois évidemment capturer la touche Ctrl, et C ou Z, etc...
    Car en mode non-canonique, les signaux ne sont pas générés.... (donc lire stdin et faire les actions en conséquences, comme appeler kill avec le bon numéro de signal sur ton propre processus si tu souhaites les garder).

    EDIT : dis-toi qu'en non-canonique, chaque touche enfoncée sera envoyée à ton programme, et c'est à toi de renvoyer au terminal les actions qu'il doit faire.

  9. #9
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Citation Envoyé par Metalman Voir le message
    Tu dois passer en mode canonique,[...]
    Ce n'est pas l'inverse ? D'après la doc de la glibc (je ne sais pas si c'est pertinent) :

    Citation Envoyé par GLIBC 17.3 Two Styles of Input: Canonical or Not
    POSIX systems support two basic modes of input: canonical and noncanonical.

    In canonical input processing mode, terminal input is processed in lines terminated by newline ('\n'), EOF, or EOL characters. No input can be read until an entire line has been typed by the user, and the read function returns at most a single line of input, no matter how many bytes are requested.

    In canonical input mode, the operating system provides input editing facilities: some characters are interpreted specially to perform editing operations within the current line of text, such as ERASE and KILL.

    (...)

    In noncanonical input processing mode, characters are not grouped into lines, and ERASE and KILL processing is not performed. The granularity with which bytes are read in noncanonical input mode is controlled by the MIN and TIME settings. See Noncanonical Input.

    Most programs use canonical input mode, because this gives the user a way to edit input line by line. The usual reason to use noncanonical mode is when the program accepts single-character commands or provides its own editing facilities.

  10. #10
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 528
    Points
    3 528
    Par défaut
    Euh oui... faut quitter le mode canonique pardon...
    Je sais juste qu'il fallait activer un truc dans le term, et je me suis obstiné à dire "mode canonique" à tord... je corrige le post précédent !

    EDIT : et ne pas oublier de tester, avant de quitter le mode canonique, si tu es dans un terminal ou dans une tâche de fond !
    C'est le isatty() qui t'aidera à faire cette distinction !

    EDIT 2 : Lien celui là a l'air vraiment bien

    EDIT 3 : ça me revient ! C'est pas "mode canonique" que l'on employait ! C'était "raw mode" ! Lien 2
    Merci pour m'avoir contredit !

  11. #11
    Membre expérimenté
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Points : 1 742
    Points
    1 742
    Par défaut
    Merci beaucoup pour vos nombreuse réponses et surtout a Metalman qui c'est démener pour me donner les bons conseils et les liens vers les codes que je vais les consulter plus tard, trop fatigué, car j'ai passer la journée d'hier et une bonne partie de la nuit a suivre le conseil de imperio et je me suis a découvrir ncurses qui n'est pas mal dans l'ensemble dont la force réside a prendre en charge de nombreux types de terminaux et donc toutes les fonctionnalités ne sont pas prise en charge par tout les terminaux, me concernant dommage que mon terminal (terminal par défaut de gnome) ne peut pas modifier les couleurs (les mélanger, fonction intéressante) et me laisse avec 8 couleurs en tout alors qu'avec les codes couleurs ont peut en avoir le double et le gros hic quand ont passe en mode ncurses avec la gestion des couleurs pris en charge je me retrouve avec un terminal voilé de gris au dessus du background noir que j'ai.
    Le keybindings est bien pris en charge, pour la souris c'est autres choses, sinon les fonctions de création de bordure de sous fenêtres sont sympa.
    C'est une librairie sympa qui souffre des défauts énoncer me concernant donc je ne sais si je vais continuer ou creuser plus du coté termios il faut que je consulte les liens de Metalman.

    Merci pour vos conseils aviser.
    Bon C Code a vous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mini-éditeur de texte
    Par solidsnakes dans le forum Assembleur
    Réponses: 7
    Dernier message: 04/02/2015, 17h46
  2. UltraEdit, l'éditeur de texte le plus vendu au monde, disponible pour Linux
    Par gege2061 dans le forum Applications et environnements graphiques
    Réponses: 44
    Dernier message: 07/06/2010, 11h00
  3. Réponses: 2
    Dernier message: 08/07/2009, 20h21
  4. éditeurs de texte Windows/Linux
    Par Jasmine80 dans le forum Langage
    Réponses: 14
    Dernier message: 01/07/2008, 12h24
  5. [PDE] Comment ajouter un éditeur de texte à mon projet ?
    Par simsky dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 29/06/2005, 10h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo