root/src/libs/glut/glutCursor.cpp
/***********************************************************
 *      Copyright (C) 1997, Be Inc.  Copyright (C) 1999, Jake Hamby.
 *
 * This program is freely distributable without licensing fees
 * and is provided without guarantee or warrantee expressed or
 * implied. This program is -not- in the public domain.
 *
 *
 *  FILE:       glutCursor.cpp
 *
 *      DESCRIPTION:    code for handling custom mouse cursors
 ***********************************************************/

/***********************************************************
 *      Headers
 ***********************************************************/
#include <GL/glut.h>
#include "glutint.h"
#include "glutState.h"
#include "glutCursors.h"

static const unsigned char *cursorTable[] = {
  XC_arrow,               /* GLUT_CURSOR_RIGHT_ARROW */
  XC_top_left_arrow,      /* GLUT_CURSOR_LEFT_ARROW */
  XC_hand1,               /* GLUT_CURSOR_INFO */
  XC_pirate,              /* GLUT_CURSOR_DESTROY */
  XC_question_arrow,      /* GLUT_CURSOR_HELP */
  XC_exchange,            /* GLUT_CURSOR_CYCLE */
  XC_spraycan,            /* GLUT_CURSOR_SPRAY */
  XC_watch,               /* GLUT_CURSOR_WAIT */
  XC_xterm,               /* GLUT_CURSOR_TEXT */
  XC_crosshair,           /* GLUT_CURSOR_CROSSHAIR */
  XC_sb_v_double_arrow,   /* GLUT_CURSOR_UP_DOWN */
  XC_sb_h_double_arrow,   /* GLUT_CURSOR_LEFT_RIGHT */
  XC_top_side,            /* GLUT_CURSOR_TOP_SIDE */
  XC_bottom_side,         /* GLUT_CURSOR_BOTTOM_SIDE */
  XC_left_side,           /* GLUT_CURSOR_LEFT_SIDE */
  XC_right_side,          /* GLUT_CURSOR_RIGHT_SIDE */
  XC_top_left_corner,     /* GLUT_CURSOR_TOP_LEFT_CORNER */
  XC_top_right_corner,    /* GLUT_CURSOR_TOP_RIGHT_CORNER */
  XC_bottom_right_corner, /* GLUT_CURSOR_BOTTOM_RIGHT_CORNER */
  XC_bottom_left_corner,  /* GLUT_CURSOR_BOTTOM_LEFT_CORNER */
};

/***********************************************************
 *      FUNCTION:       glutSetCursor (4.13)
 *
 *      DESCRIPTION:  set a new mouse cursor for current window
 ***********************************************************/
void glutSetCursor(int cursor) {
        gState.currentWindow->Window()->Lock();
        gState.currentWindow->cursor = cursor;
        __glutSetCursor(cursor);
        gState.currentWindow->Window()->Unlock();
}

/***********************************************************
 *      FUNCTION:       __glutSetCursor
 *
 *      DESCRIPTION:  the actual cursor changing routine
 ***********************************************************/
void __glutSetCursor(int cursor) {
        int realcursor = cursor;
        if (cursor < 0 || cursor > GLUT_CURSOR_BOTTOM_LEFT_CORNER) {
                switch(cursor) {
                case GLUT_CURSOR_INHERIT:
                        return;         // don't change cursor
                case GLUT_CURSOR_NONE:
                        // this hides the cursor until the user moves the mouse
                        // change it to HideCursor() AT YOUR OWN RISK!
                        be_app->ObscureCursor();
                        return;
                case GLUT_CURSOR_FULL_CROSSHAIR:
                        realcursor = GLUT_CURSOR_CROSSHAIR;
                        break;
                default:
                        __glutWarning("unknown cursor\n");
                        return;
                }
        }
        be_app->SetCursor(cursorTable[realcursor]);
}

/***********************************************************
 *      FUNCTION:       glutWarpPointer (x.xx)
 *
 *      DESCRIPTION:  move the mouse pointer to a new location
 *              (note:  can't do this in BeOS!)
 ***********************************************************/
void glutWarpPointer(int x, int y) { }