De la couleur dans un Xterm avec un printf

Je voudrai afficher du texte en couleur dans un Xterm ! Et bien sur, j y arrive pas!
J'ai bien vu que y a Ncurses, mais ca me plait pas, d'ailleur ca a du mal sur ma red hat. Et apres au joie,bohneur inegalable, je vois qu'on peux faire ca en sortant avec printf des truc comme ca : [33/24m ....;, genial ca marche sous le SHELL, mais pas sous Xterm! Snif ! Bon, si qqun sait comment afficher en couleur dans un Xterm, Merci de me le dire! A++

4 réponses

  1. Pas la peine de se prendre la tête avec des termcaps, comme tu le dit avec un printf c'est possible :

    exemple :
    /* Affichera Hello en violet si ma mémoire et bonne */
    printf("\033[34mHello\n"); 
    
    /* Affichera Hello en rouge sur fond bleu */
    printf("\033[45;31mHello");
    
    /* Affichera Hello en rouge sur fond bleu en clignotant */
    printf("\033[45;31;5mHello"); 
    

    on peut en mettre 3 séparé par des ;
    \033[COL;COL;COLm

    les couleurs vont de 30 a 37
    les couleurs de fond vont de 40 a 47
    les diverses options vont de 0 a 7 (si ma mémoire est bonne)

    PS: je sais que le sujet date mais comme c'est le premier sur lequel les gens tombent en général, c'est préférable que la réponse y figure ^^.
    1
    1. man tgetent et tgetstr:
      [...]
      #include <termcap.h>

      char PC;
      char *BC;
      char *UP;
      short ospeed;
      struct tinfo *info;

      int
      tgetent(char *bp, char *name);
      [...]
      char *
      tgetstr(char *id, char **area);
      [...]
      The tgetent() function extracts the entry for terminal name into the
      buffer at bp. The bp argument should be a character buffer of size 1024
      and must be retained through all subsequent calls to tgetnum(),
      tgetflag(), and tgetstr().
      [...]

      man 5 termcap
      [...]
      AB str Set background colour to #1 using ANSI
      escape.
      [...]
      AF str Set foreground colour to #1 using ANSI
      escape.

      Ce qui nous donne (sans les gestions d'erreurs):

      char *name;
      char bp[1024];
      char t[4096];
      char *area;
      char *AB, *AF;

      name = getenv("TERM");
      tgetent(bp, name);
      area = t;
      AF = tgetstr("AF", &area);
      AB = tgetstr("AB", &area);

      En fin de compte dans les chaine AB et AF il y a une chaine de
      format qui attends un int:

      ESC[4%dm
      ESC[3%dm

      Pour les numero des couleurs:

      #define BLACK 0
      #define RED 1
      #define GREEN 2
      #define YELLOW 3
      #define BLUE 4
      #define PINK 5
      #define L_BLUE 6
      #define NORMAL 7

      ---------------------------------------------------------

      #include <termcap.h>
      #include <stdlib.h>

      #define BLACK 0
      #define RED 1
      #define GREEN 2
      #define YELLOW 3
      #define BLUE 4
      #define PINK 5
      #define L_BLUE 6
      #define NORMAL 7

      int main(void)
      {
      char *name;
      char bp[1024];
      char t[4096];
      char *area;
      char *AB, *AF;

      name = getenv("TERM");
      tgetent(bp, name);
      area = t;
      AF = tgetstr("AF", &area);
      AB = tgetstr("AB", &area);
      printf(AF, GREEN);
      printf("bonjour(s)\n");
      return (0);
      }

      ------------------------------------------------------------

      cc 0 ~>gcc main.c -ltermcap
      cc 0 ~>./a.out

      --> ecrit bonjour(s) en vert.

      -- 
      julien barbier
      1