How to close an openGL window

13.1k views Asked by At

Here, I have two loops. The first loop processes the graphics for a few seconds and then the code goes to the second loop. I process the graphical events via glutMainLoopEvent in the first loop. Before the second loop starts, I would like to close the graphic window. It seems the command glutLeaveMainLoop cannot close the window. What other function should I use to force the window closed right after the first loop?

#include <stdio.h>
#include <GL/freeglut.h>
#include <boost/thread/thread.hpp> // for sleep

void cback_render()
{
    if(!glutGetWindow())
        return ;
    static float rotations = 0;

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();
    glRotatef(rotations, 0, 0, 1);

    glBegin(GL_TRIANGLES);
        glVertex3f(0,0,0);
        glVertex3f(1,0,0);
        glVertex3f(0,1,0);
    glEnd();

    glutSwapBuffers();

    if (++rotations > 360) rotations -= 360;
}

void timer(int )
{
    if(!glutGetWindow())
        return ;
    glutPostRedisplay();
    glutMainLoopEvent();
    glutTimerFunc(30, timer, 1);
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(512, 512);
    glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS);

    glutCreateWindow("freegluttest");
    glutDisplayFunc (cback_render);
    glutTimerFunc(30, timer, 1);

    long i=0;
    while(glutGetWindow() && i< 30)
    {
        printf("[%ld]\n",i);
        i++;
        glutMainLoopEvent();
        boost::this_thread::sleep( boost::posix_time::milliseconds(100) );
    }
    glutMainLoopEvent();

    glutLeaveMainLoop(); // does not work
    glutMainLoopEvent();

    // do something else ....
    while(1)
    {
        // other calculations
        boost::this_thread::sleep( boost::posix_time::milliseconds(100) );
    }

    return 0;
}
1

There are 1 answers

4
Harish On BEST ANSWER

Ok from the freeglut docs at http://freeglut.sourceforge.net/docs/api.php#EventProcessing

The function you are using glutLeaveMainLoop() is to simply stop the glut's main loop, if it is started by glutMainLoop() not glutMainLoopEvent().

Since you are controlling the loop yourself in your example, glutLeaveMainLoop() won't do anything.

It is intended to leave glut's main loop IF glut is controlling it not you.

Since you have a while(1) at the end with a 100ms sleep, the app will do nothing else when it gets there after all the frames have been rendered. If you want to destroy the window use some window function like glutDestroyWindow().