#include <GL/glut.h>
#include <cstdlib>


int main_window;
int win_w, win_h;

void init(void)
{    
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel(GL_SMOOTH);
   glEnable(GL_DEPTH_TEST);
}


void display(void)
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

  glBegin(GL_TRIANGLES);
  {    
    glVertex3f( -2,  0, -2 );
    glVertex3f(  2,  0, -2 );
    glVertex3f(  0,  2, -2 );
  }
  glEnd();
  
  glutSwapBuffers();
}


void reshape(int w, int h)
{
  win_w = w;  win_h = h;

  glViewport(0, 0, (GLsizei) win_w, (GLsizei) win_h);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(90, (GLfloat) win_w/(GLfloat) win_h, .5, 30.0);
}


void myGlutIdle( void )
{
  /* According to the GLUT specification, the current window is 
     undefined during an idle callback.  So we need to explicitly change
     it if necessary */
  if ( glutGetWindow() != main_window ) 
    glutSetWindow(main_window);  

  glutPostRedisplay();
}

void keyboard(unsigned char key, int x, int y)
{
  if(key == 'q' || key == 'Q')
    exit(0);
}



void mouse(int button, int state, int x, int y) 
{

  if (button == GLUT_LEFT_BUTTON) {
    if (state == GLUT_DOWN) {
      // do something...
    }
  }
  
}
 

int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
   glutInitWindowSize(512, 512);
   glutInitWindowPosition(100, 100);
   main_window = glutCreateWindow(argv[0]);

   init();

   glutDisplayFunc(display);
   glutReshapeFunc(reshape);
   glutIdleFunc( myGlutIdle );

   glutMouseFunc(mouse);

   glutKeyboardFunc(keyboard);

   glutMainLoop();
   return 0; 
}

