File: cursors.c

/*
  cursors.c

  A basic test of setting various cursors.
*/

#define CPWDLL_EXTERN
#include <cpw.h>

static int count1 = 0;
static int count2 = 0;

/****************************************************/
/*  Window Create / Destroy Event callback          */
/****************************************************/

void window( pCpw cpw, uint_32 winid, bool flag )
{
    if ( flag == true ) {

        /* creation event */

        switch( winid ) {
            case 1:
                glShadeModel(GL_SMOOTH);
                glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
                glClearDepth(1.0f);
                glEnable(GL_DEPTH_TEST);
                glDepthFunc(GL_LEQUAL);
                glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
                glEnable(GL_BLEND);
                glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
            break;
            case 2:
                glShadeModel(GL_SMOOTH);
                glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
                glClearDepth(1.0f);
                glEnable(GL_DEPTH_TEST);
                glDepthFunc(GL_LEQUAL);
                glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
                glEnable(GL_BLEND);
                glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
            break;
        }
        return;
    }

    if ( flag == false ) {
        /* close event */
        cpwDestroyWindow( cpw, winid );
        return;
    }
}

/****************************************************/
/*  Draw Window One                                 */
/****************************************************/

void drawWindowOne( pCpw cpw ) 
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glPushMatrix();

    glTranslatef(-1.5f,0.0f,-6.0f);
    glBegin(GL_TRIANGLES);
    glVertex3f( 0.0f, 1.0f, 0.0f);
    glVertex3f(-1.0f,-1.0f, 0.0f);
    glVertex3f( 1.0f,-1.0f, 0.0f);
    glEnd();
    glTranslatef(3.0f,0.0f,0.0f);
    glBegin(GL_QUADS);
    glVertex3f(-1.0f, 1.0f, 0.0f);
    glVertex3f( 1.0f, 1.0f, 0.0f);
    glVertex3f( 1.0f,-1.0f, 0.0f);
    glVertex3f(-1.0f,-1.0f, 0.0f);
    glEnd();

    glPopMatrix();
}

/****************************************************/
/*  Draw Window Two                                 */
/****************************************************/

void drawWindowTwo( pCpw cpw ) 
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glPushMatrix();

    glTranslatef(-1.5f,0.0f,-6.0f);
    glBegin(GL_TRIANGLES);
    glColor3f(1.0f,0.0f,0.0f);
    glVertex3f( 0.0f, 1.0f, 0.0f);
    glColor3f(0.0f,1.0f,0.0f);
    glVertex3f(-1.0f,-1.0f, 0.0f);
    glColor3f(0.0f,0.0f,1.0f);
    glVertex3f( 1.0f,-1.0f, 0.0f);
    glEnd();
    glTranslatef(3.0f,0.0f,0.0f);
    glColor3f(0.5f,0.5f,1.0f);
    glBegin(GL_QUADS);
    glVertex3f(-1.0f, 1.0f, 0.0f);
    glVertex3f( 1.0f, 1.0f, 0.0f);
    glVertex3f( 1.0f,-1.0f, 0.0f);
    glVertex3f(-1.0f,-1.0f, 0.0f);
    glEnd();

    glPopMatrix();
}

/****************************************************/
/*  Window Draw Event callback                      */
/****************************************************/

void draw( pCpw cpw, uint_32 winid )
{
    switch( winid ) {
        case 1:
        drawWindowOne( cpw );
        break;
        case 2:
        drawWindowTwo( cpw );
        break;
    }
    cpwSwapWindowBuffers( cpw, winid );
}

/****************************************************/
/*  Window Resize Event callback                    */
/****************************************************/

void reshape( pCpw cpw, uint_32 winid, uint_32 width, uint_32 height )
{
    if ( cpwNextEvent( cpw ) == CPW_RESHAPE_EVENT ) return;

	if (height==0)
	{
		height=1;
	}

	glViewport(0,0,width,height);

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
}

/****************************************************/
/*  Timer One Event Callback                        */
/****************************************************/

void timer1( pCpw cpw, uint_32 id )
{
    /* test all cursors */

    if ( count1 == 0 ) cpwSetCursor( cpw, CursorArrow, 1 );
    if ( count1 == 1 ) cpwSetCursor( cpw, CursorHand, 1 );
    if ( count1 == 2 ) cpwSetCursor( cpw, CursorNo, 1 );
    if ( count1 == 3 ) cpwSetCursor( cpw, CursorQuestion, 1 );
    if ( count1 == 4 ) cpwSetCursor( cpw, CursorBeam, 1 );
    if ( count1 == 5 ) cpwSetCursor( cpw, CursorWait, 1 );
    if ( count1 == 6 ) cpwSetCursor( cpw, CursorCrosshair, 1 );
    if ( count1 == 7 ) cpwSetCursor( cpw, CursorNone, 1 );
    if ( count1 == 8 ) cpwSetCursor( cpw, CursorSizeNSEW, 1 );
    if ( count1 == 9 ) cpwSetCursor( cpw, CursorSizeNS, 1 );
    if ( count1 == 10 ) cpwSetCursor( cpw, CursorSizeNeSw, 1 );
    if ( count1 == 11 ) cpwSetCursor( cpw, CursorSizeEW, 1 );
    if ( count1 == 12 ) cpwSetCursor( cpw, CursorSizeSeNw, 1 );

    count1++;

    if ( count1 == 13 ) count1 = 0;

}

/****************************************************/
/*  Timer Two Event Callback                        */
/****************************************************/

void timer2( pCpw cpw, uint_32 id )
{
    /* Gopher had a cool cursor. */

    if ( count2 == 0 ) cpwSetCursor( cpw, CursorSizeNS, 2 );
    if ( count2 == 1 ) cpwSetCursor( cpw, CursorSizeNeSw, 2 );
    if ( count2 == 2 ) cpwSetCursor( cpw, CursorSizeEW, 2 );
    if ( count2 == 3 ) cpwSetCursor( cpw, CursorSizeSeNw, 2 );
    if ( count2 == 4 ) cpwSetCursor( cpw, CursorSizeNS, 2 );
    if ( count2 == 5 ) cpwSetCursor( cpw, CursorSizeNeSw, 2 );
    if ( count2 == 6 ) cpwSetCursor( cpw, CursorSizeEW, 2 );
    if ( count2 == 7 ) cpwSetCursor( cpw, CursorSizeSeNw, 2 );

    count2++;

    if ( count2 == 8 ) count2 = 0;

    //cpwPositionCursor( cpw, 10, 10, 2 );
    //cpwCenterCursor( cpw, 2 );
}

/****************************************************/
/*  Mainloop Event Callback                         */
/****************************************************/

void mainloop( pCpw cpw, bool eventspending )
{
}

/****************************************************/
/*  Main                                            */
/****************************************************/

int main(int argc, char* argv[])
{
    pCpw cpw;

    cpw = null;

    cpwInitContext( &cpw );

    cpwInitWindowPosition( cpw, 200, 200 );
    cpwInitWindowSize( cpw, 100, 100 );

    cpwCreateWindow( cpw, "Cpw 1" );
    cpwCreateWindowEx( cpw, "Cpw 2", 125, 125, 200, 200 );

    cpwCreateCallback( cpw, window );
    cpwDisplayCallback( cpw, draw );
    cpwReshapeCallback( cpw, reshape );
    cpwMainLoopCallback( cpw, mainloop, 100 );

    cpwTimerCallback( cpw, 500, 1, true, timer1 );
    cpwTimerCallback( cpw, 100, 1, true, timer2 );

    cpwFilterEvent( cpw, CPW_MOUSEMOTION_EVENT, true );

    cpwMainLoop( cpw );

    cpwFreeContext( &cpw );

	return 0;
}