1c041511dScube/***********************************************************
2c041511dScube *      Copyright (C) 1997, Be Inc.  Copyright (C) 1999, Jake Hamby.
3c041511dScube *
4c041511dScube * This program is freely distributable without licensing fees
5c041511dScube * and is provided without guarantee or warrantee expressed or
6c041511dScube * implied. This program is -not- in the public domain.
7c041511dScube *
8c041511dScube *
9c041511dScube *  FILE:	glutCursor.cpp
10c041511dScube *
11c041511dScube *	DESCRIPTION:	code for handling custom mouse cursors
12c041511dScube ***********************************************************/
13c041511dScube
14c041511dScube/***********************************************************
15c041511dScube *	Headers
16c041511dScube ***********************************************************/
17c041511dScube#include <GL/glut.h>
18c041511dScube#include "glutint.h"
19c041511dScube#include "glutState.h"
20c041511dScube#include "glutCursors.h"
21c041511dScube
22c041511dScubestatic const unsigned char *cursorTable[] = {
23c041511dScube  XC_arrow,		  /* GLUT_CURSOR_RIGHT_ARROW */
24c041511dScube  XC_top_left_arrow,	  /* GLUT_CURSOR_LEFT_ARROW */
25c041511dScube  XC_hand1,		  /* GLUT_CURSOR_INFO */
26c041511dScube  XC_pirate,		  /* GLUT_CURSOR_DESTROY */
27c041511dScube  XC_question_arrow,	  /* GLUT_CURSOR_HELP */
28c041511dScube  XC_exchange,		  /* GLUT_CURSOR_CYCLE */
29c041511dScube  XC_spraycan,		  /* GLUT_CURSOR_SPRAY */
30c041511dScube  XC_watch,		  /* GLUT_CURSOR_WAIT */
31c041511dScube  XC_xterm,		  /* GLUT_CURSOR_TEXT */
32c041511dScube  XC_crosshair,		  /* GLUT_CURSOR_CROSSHAIR */
33c041511dScube  XC_sb_v_double_arrow,	  /* GLUT_CURSOR_UP_DOWN */
34c041511dScube  XC_sb_h_double_arrow,	  /* GLUT_CURSOR_LEFT_RIGHT */
35c041511dScube  XC_top_side,		  /* GLUT_CURSOR_TOP_SIDE */
36c041511dScube  XC_bottom_side,	  /* GLUT_CURSOR_BOTTOM_SIDE */
37c041511dScube  XC_left_side,		  /* GLUT_CURSOR_LEFT_SIDE */
38c041511dScube  XC_right_side,	  /* GLUT_CURSOR_RIGHT_SIDE */
39c041511dScube  XC_top_left_corner,	  /* GLUT_CURSOR_TOP_LEFT_CORNER */
40c041511dScube  XC_top_right_corner,	  /* GLUT_CURSOR_TOP_RIGHT_CORNER */
41c041511dScube  XC_bottom_right_corner, /* GLUT_CURSOR_BOTTOM_RIGHT_CORNER */
42c041511dScube  XC_bottom_left_corner,  /* GLUT_CURSOR_BOTTOM_LEFT_CORNER */
43c041511dScube};
44c041511dScube
45c041511dScube/***********************************************************
46c041511dScube *	FUNCTION:	glutSetCursor (4.13)
47c041511dScube *
48c041511dScube *	DESCRIPTION:  set a new mouse cursor for current window
49c041511dScube ***********************************************************/
50c041511dScubevoid glutSetCursor(int cursor) {
51c041511dScube	gState.currentWindow->Window()->Lock();
52c041511dScube	gState.currentWindow->cursor = cursor;
53c041511dScube	__glutSetCursor(cursor);
54c041511dScube	gState.currentWindow->Window()->Unlock();
55c041511dScube}
56c041511dScube
57c041511dScube/***********************************************************
58c041511dScube *	FUNCTION:	__glutSetCursor
59c041511dScube *
60c041511dScube *	DESCRIPTION:  the actual cursor changing routine
61c041511dScube ***********************************************************/
62c041511dScubevoid __glutSetCursor(int cursor) {
63c041511dScube	int realcursor = cursor;
64c041511dScube	if (cursor < 0 || cursor > GLUT_CURSOR_BOTTOM_LEFT_CORNER) {
65c041511dScube		switch(cursor) {
66c041511dScube		case GLUT_CURSOR_INHERIT:
67c041511dScube			return;		// don't change cursor
68c041511dScube		case GLUT_CURSOR_NONE:
69c041511dScube			// this hides the cursor until the user moves the mouse
70c041511dScube			// change it to HideCursor() AT YOUR OWN RISK!
71c041511dScube			be_app->ObscureCursor();
72c041511dScube			return;
73c041511dScube		case GLUT_CURSOR_FULL_CROSSHAIR:
74c041511dScube			realcursor = GLUT_CURSOR_CROSSHAIR;
75c041511dScube			break;
76c041511dScube		default:
77c041511dScube			__glutWarning("unknown cursor\n");
78c041511dScube			return;
79c041511dScube		}
80c041511dScube	}
81c041511dScube	be_app->SetCursor(cursorTable[realcursor]);
82c041511dScube}
83c041511dScube
84c041511dScube/***********************************************************
85c041511dScube *	FUNCTION:	glutWarpPointer (x.xx)
86c041511dScube *
87c041511dScube *	DESCRIPTION:  move the mouse pointer to a new location
88c041511dScube *		(note:  can't do this in BeOS!)
89c041511dScube ***********************************************************/
90c041511dScubevoid glutWarpPointer(int x, int y) { }
91