DOCUMENT ID: 1480-02

SYNOPSIS:    Setting Console Colors on x86

OS RELEASE:  Solaris x86

PRODUCT:     OS

KEYWORDS:    console colors ansi escape sequence


DESCRIPTION:

How to setup up Console Colors on x86.


SOLUTION:

                              ANSI ESCAPE SEQUENCE
______________________________________________________________________________

Wherever you see '#', that should be replaced by the appropriate number.

        ESC code sequence                       Function
       -------------------              ---------------------------
Cursor Controls:
         ESC[#;#H or ESC[#;#f           Moves cusor to line #, column #
         ESC[#A                         Moves cursor up # lines
         ESC[#B                         Moves cursor down # lines
         ESC[#C                         Moves cursor forward # spaces
         ESC[#D                         Moves cursor back # spaces
         ESC[#;#R                       Reports current cursor line & column
         ESC[s                          Saves cursor position for recall later
         ESC[u                          Return to saved cursor position

Erase Functions:
         ESC[2J                         Clear screen and home cursor
         ESC[K                          Clear to end of line

Set Graphics Rendition:
         ESC[#;#;....;#m                Set display attributes where # is
                                            0 for normal display
                                            1 for bold on
                                            4 underline (mono only)
                                            5 blink on
                                            7 reverse video on
                                            8 nondisplayed (invisible)
                                            30 black foreground
                                            31 red foreground
                                            32 green foreground
                                            33 yellow foreground
                                            34 blue foreground
                                            35 magenta foreground
                                            36 cyan foreground
                                            37 white foreground
                                            40 black background
                                            41 red background
                                            42 green background
                                            43 yellow background
                                            44 blue background
                                            45 magenta background
                                            46 cyan background
                                            47 white background

         ESC[=#;7h or                   Put screen in indicated mode where # is
         ESC[=h or                          0 for 40 x 25 black & white
         ESC[=0h or                         1 for 40 x 25 color
         ESC[?7h                            2 for 80 x 25 b&w
                                            3 for 80 x 25 color
                                            4 for 320 x 200 color graphics
                                            5 for 320 x 200 b & w graphics
                                            6 for 640 x 200 b & w graphics
                                            7 to wrap at end of line

         ESC[=#;7l or ESC[=l or         Resets mode # set with above command
         ESC[=0l or ESC[?7l

Keyboard Reassignments:
         ESC[#;#;...p                   Keyboard reassignment. The first ASCII
         or ESC["string"p               code defines which code is to be
         or ESC[#;"string";#;           changed. The remaining codes define
            #;"string";#p               what it is to be changed to.

         E.g. Reassign the Q and q keys to the A and a keys (and vice versa).
         ESC [65;81p                    A becomes Q
         ESC [97;113p                   a becomes q
         ESC [81;65p                    Q becomes A
         ESC [113;97p                   q becomes a

         E.g. Reassign the F10 key to a DIR command.
         ESC [0;68;"dir";13p            The 0;68 is the extended ASCII code
                                        for the F10 key and 13 is the ASCII
                                        code for a carriage return.

         Other function key codes       F1=59,F2=60,F3=61,F4=62,F5=63
                                        F6=64,F7=65,F8=66,F9=67,F10=68
____________________________________________________________________________

Here is a program to change the display colors:


/* ASCII Setcolors 

   Needs for UNIX check term types and dissable under wrong term type

   Add Numberic color input
    
   accept other color abriviations 
  
   Allow other Ascii modes, IE: Blinking or inverse

   To compile just cc -o scolor scolor.c

*/  


 #include 
 #include 

 #define  COL_DEF3 "bla red gre yel blu mag cya whi hig "
 #define  COL_DEF2 "blk rd  grn bro bu  mgn cyn wht hi  "
 #define  COL_DEF  "bk  r   g   y   b   m   c   w   h   "
            /*   Will Never Hit 'b' for blue, black gets it */
                      

 #define  ESCB    "\033["
 #define  ESCA    "ESC["
 #define  HIGH    "7;"

 int what_color(arg)
 char *arg;
 {
 char str[5];
 char *COL,*res,*t,*s;
 int colr;


  strncpy(str,arg,4);
  str[3] = '\0';

 /* Force lower case before search */ 
  for( s = str;*s != '\0';s++)
      if (*s < 'Z' & *s > 'A')  
          *s = *s + 'a' - 'A';


 /* Convert define to mem location */
 COL = COL_DEF;

  res = strstr(COL,str);

  if (res != NULL)
   {
      colr =  res - COL;
      return (colr/4 +1) ;
   } 
 
 /* Convert define to mem location */
 COL = COL_DEF2;

  res = strstr(COL,str);

  if (res != NULL)
   {
      colr =  res - COL;
      return (colr/4 +1) ;
   }  
 /* Convert define to mem location */
 COL = COL_DEF3;

  res = strstr(COL,str);

  if (res != NULL)
   {
      colr =  res - COL;
      return (colr/4 +1) ;
   }  

  return 0;
 }

 int main(argc,argv)
 int argc; char* argv[];
 {
   
  int fg,bg,hi,c[3],ind;
  char *his;

   if (argc < 2 | argc > 4) 
    {        
        printf("%smUsage:setcolor forground background\n",ESCB);
        return 1; 
    }
   

  c[0]=c[1]=c[2]=fg=bg=hi = 0;

  ind = 1;

  while(ind < argc)
  { 
    c[ind - 1] = what_color(argv[ind]);
    if(c[ind -1] == 9) 
       hi = 1;
    ind++;
  }

   /*printf("%i,%i,%i,%i\n",c[0],c[1],c[2],hi);*/

   ind = 0;
    if(c[ind] >= 9) ind++;
    fg = c[ind++];

    if(c[ind] >= 9) ind++;
    bg = c[ind++];

    if (hi == 1) his = "7;"; 
     else
      { his = "\0";
         printf("%sm",ESCB);
      }


   if (fg == bg & hi == 0) 
    {
      printf("%smError:Same forground and background color\n",ESCB);
      return 1;
    }
        
   if (fg != 0 & bg != 0)
     printf("%s%s3%i;4%im\n",ESCB,his,fg-1,bg-1);
   else
   if (bg != 0)
     printf("%s%s4%im\n",ESCB,his,bg-1);
   else
   if (fg != 0)
     printf("%s%s3%im\n",ESCB,his,fg-1);

}


DATE APPROVED: 07/28/95