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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    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
    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 : 36
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    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...
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  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 : 53
    Localisation : France, Moselle (Lorraine)

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

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    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 Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    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 : 872
    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

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    Par défaut
    Autre conseil, jette un œil du coté de nano, qui est lui aussi écrit en C.

  6. #6
    Membre éprouvé
    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
    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.

+ 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