home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 1.iso / toolbox / src / exampleCode / opengl / GLUT / lib / fglut / glut_cursor.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-11-11  |  3.7 KB  |  128 lines

  1. /* Copyright (c) Mark J. Kilgard, 1995. */
  2.  
  3. /* This program is freely distributable without licensing fees 
  4.    and is provided without guarantee or warrantee expressed or 
  5.    implied. This program is -not- in the public domain. */
  6.  
  7. #include <GL/glut.h>
  8. #include "glutint.h"
  9. #include <X11/Xatom.h>  /* For XA_CURSOR */
  10. #include <X11/cursorfont.h>
  11.  
  12. typedef struct _CursorTable {
  13.   int glyph;
  14.   Cursor cursor;
  15. } CursorTable;
  16. /* *INDENT-OFF* */
  17.  
  18. static CursorTable cursorTable[] = {
  19.   {XC_arrow, None},          /* GLUT_CURSOR_RIGHT_ARROW */
  20.   {XC_top_left_arrow, None},      /* GLUT_CURSOR_LEFT_ARROW */
  21.   {XC_hand1, None},          /* GLUT_CURSOR_INFO */
  22.   {XC_pirate, None},          /* GLUT_CURSOR_DESTROY */
  23.   {XC_question_arrow, None},      /* GLUT_CURSOR_HELP */
  24.   {XC_exchange, None},          /* GLUT_CURSOR_CYCLE */
  25.   {XC_spraycan, None},          /* GLUT_CURSOR_SPRAY */
  26.   {XC_watch, None},          /* GLUT_CURSOR_WAIT */
  27.   {XC_xterm, None},          /* GLUT_CURSOR_TEXT */
  28.   {XC_crosshair, None},          /* GLUT_CURSOR_CROSSHAIR */
  29.   {XC_sb_v_double_arrow, None},      /* GLUT_CURSOR_UP_DOWN */
  30.   {XC_sb_h_double_arrow, None},      /* GLUT_CURSOR_LEFT_RIGHT */
  31.   {XC_top_side, None},          /* GLUT_CURSOR_TOP_SIDE */
  32.   {XC_bottom_side, None},      /* GLUT_CURSOR_BOTTOM_SIDE */
  33.   {XC_left_side, None},          /* GLUT_CURSOR_LEFT_SIDE */
  34.   {XC_right_side, None},      /* GLUT_CURSOR_RIGHT_SIDE */
  35.   {XC_top_left_corner, None},      /* GLUT_CURSOR_TOP_LEFT_CORNER */
  36.   {XC_top_right_corner, None},      /* GLUT_CURSOR_TOP_RIGHT_CORNER */
  37.   {XC_bottom_right_corner, None}, /* GLUT_CURSOR_BOTTOM_RIGHT_CORNER */
  38.   {XC_bottom_left_corner, None},  /* GLUT_CURSOR_BOTTOM_LEFT_CORNER */
  39. };
  40. /* *INDENT-ON* */
  41.  
  42. static Cursor blankCursor = None;
  43. static Cursor fullCrosshairCusor = None;
  44.  
  45. static Cursor
  46. getFullCrosshairCursor(void)
  47. {
  48.   Cursor cursor;
  49.   Atom crosshairAtom, actualType;
  50.   int rc, actualFormat;
  51.   unsigned long n, left;
  52.   unsigned long *value;
  53.  
  54.   if (fullCrosshairCusor == None) {
  55.     crosshairAtom = XInternAtom(__glutDisplay,
  56.       "_SGI_CROSSHAIR_CURSOR", True);
  57.     if (crosshairAtom != None) {
  58.       value = 0;        /* Make compiler happy. */
  59.       rc = XGetWindowProperty(__glutDisplay, __glutRoot,
  60.         crosshairAtom, 0, 1, False, XA_CURSOR, &actualType,
  61.         &actualFormat, &n, &left, (unsigned char **) &value);
  62.       if (rc == Success && actualFormat == 32 && n >= 1) {
  63.         cursor = value[0];
  64.         XFree(value);
  65.         return cursor;
  66.       }
  67.     }
  68.   }
  69.   return XCreateFontCursor(__glutDisplay, XC_crosshair);
  70. }
  71.  
  72. static Cursor
  73. makeBlankCursor(void)
  74. {
  75.   static char data[1] =
  76.   {0};
  77.   Cursor cursor;
  78.   Pixmap blank;
  79.   XColor dummy;
  80.  
  81.   blank = XCreateBitmapFromData(__glutDisplay, __glutRoot,
  82.     data, 1, 1);
  83.   if (blank == None)
  84.     __glutFatalError("out of memory.");
  85.   cursor = XCreatePixmapCursor(__glutDisplay, blank, blank,
  86.     &dummy, &dummy, 0, 0);
  87.   XFreePixmap(__glutDisplay, blank);
  88.  
  89.   return cursor;
  90. }
  91.  
  92. /* CENTRY */
  93. void
  94. glutSetCursor(int cursor)
  95. {
  96.   Cursor xcursor;
  97.  
  98.   if (cursor >= 0 &&
  99.     cursor < sizeof(cursorTable) / sizeof(cursorTable[0])) {
  100.     if (cursorTable[cursor].cursor == None)
  101.       cursorTable[cursor].cursor = XCreateFontCursor(__glutDisplay,
  102.         cursorTable[cursor].glyph);
  103.     xcursor = cursorTable[cursor].cursor;
  104.   } else {
  105.     /* Special cases. */
  106.     switch (cursor) {
  107.     case GLUT_CURSOR_INHERIT:
  108.       xcursor = None;
  109.       break;
  110.     case GLUT_CURSOR_NONE:
  111.       if (blankCursor == None)
  112.         blankCursor = makeBlankCursor();
  113.       xcursor = blankCursor;
  114.       break;
  115.     case GLUT_CURSOR_FULL_CROSSHAIR:
  116.       if (fullCrosshairCusor == None)
  117.         fullCrosshairCusor = getFullCrosshairCursor();
  118.       xcursor = fullCrosshairCusor;
  119.       break;
  120.     }
  121.   }
  122.   __glutCurrentWindow->cursor = cursor;
  123.   XDefineCursor(__glutDisplay,
  124.     __glutCurrentWindow->win, xcursor);
  125.   XFlush(__glutDisplay);
  126. }
  127. /* ENDCENTRY */
  128.