#include <GL/glut.h>                         /* Header fuer OpenGl utility toolkit*/
#include <stdlib.h>                          /* Header fuer C-Library             */

GLfloat r=1.0, g=0.0, b=0.0;                 /* globales RGB-Tripel               */

void init(void) {                            /* Initialisierung                   */
  glClearColor(0.5, 0.5, 0.5, 0.0);          /* setze Grau als Hintergrundfarbe   */
  glMatrixMode(GL_PROJECTION);               /* betrifft Projektionsmatrix        */
  glLoadIdentity();                          /* beginne mit Einheitsmatrix        */
  gluOrtho2D(0.0, 1.5, 0.0, 1.0);            /* Orthogonalprojektions-Clip-Ebenen */
}                                            /* in 2D: left,right,bottom, top     */

void display(void){                          /* Prozedur zum Zeichnen             */
  glClear(GL_COLOR_BUFFER_BIT);              /* alle Pixel zurecksetzen           */
  glColor3f(r,g,b);                          /* Farbe gemaess RGB-Tripel          */ 
  glBegin(GL_TRIANGLES);                     /* Beginn eines Dreiecks             */
    glVertex2f(0.25, 0.25);                  /* links unten                       */
    glVertex2f(0.75, 0.25);                  /* rechts unten                      */
    glVertex2f(0.25, 0.75);                  /* links oben                        */
  glEnd();                                   /* Ende des Dreiecks                 */
  glFlush();                                 /* direkt ausgeben                   */
}

void key(unsigned char key, int x, int y){   /* Bei Tastendruck                   */ 
  switch(key) {                              /* analysiere den Tastendruck        */
    case 'r': r=1.0; g=0.0; b=0.0; break;    /* falls 'r': setze Tripel auf Rot   */
    case 'g': r=0.0; g=1.0; b=0.0; break;    /* falls 'g': setze Tripel auf Gruen */
    case 'b': r=0.0; g=0.0; b=1.0; break;    /* falls 'b': setze Tripel auf Blau  */
  }
  glutPostRedisplay();
}

int main (int argc, char ** argv) {          /* Hauptprogramm                     */
  glutInit(&argc, argv);                     /* initialisiere GLUT                */
  glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); /* single buffer, true color         */
  glutInitWindowSize(800, 600);              /* initiale Fenstergroesse           */
  glutInitWindowPosition(0,0);               /* initiale Fensterposition          */
  glutCreateWindow("key");                   /* Fenster mit Aufschrift            */
  init();                                    /* rufe init auf                     */
  glutDisplayFunc(display);                  /* registriere display               */
  glutKeyboardFunc(key);                     /* registriere key                   */
  glutMainLoop();                            /* beginne Event-Schleife            */
  return 0;                                  /* ISO C verlangt Rueckgabe          */
}