Skip to content

AFNI/NIfTI Server

Sections
Personal tools
You are here: Home » AFNI » Documentation

Doxygen Source Code Documentation


Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search  

glut_cursor.c

Go to the documentation of this file.
00001 
00002 /* Copyright (c) Mark J. Kilgard, 1995. */
00003 
00004 /* This program is freely distributable without licensing fees 
00005    and is provided without guarantee or warrantee expressed or 
00006    implied. This program is -not- in the public domain. */
00007 
00008 #include <GL/glut.h>
00009 #include "glutint.h"
00010 #include <X11/Xatom.h>  /* For XA_CURSOR */
00011 #include <X11/cursorfont.h>
00012 
00013 typedef struct _CursorTable {
00014   int glyph;
00015   Cursor cursor;
00016 } CursorTable;
00017 
00018 static CursorTable cursorTable[] = {
00019   {XC_arrow, None},               /* GLUT_CURSOR_RIGHT_ARROW */
00020   {XC_top_left_arrow, None},      /* GLUT_CURSOR_LEFT_ARROW */
00021   {XC_hand1, None},               /* GLUT_CURSOR_INFO */
00022   {XC_pirate, None},              /* GLUT_CURSOR_DESTROY */
00023   {XC_question_arrow, None},      /* GLUT_CURSOR_HELP */
00024   {XC_exchange, None},            /* GLUT_CURSOR_CYCLE */
00025   {XC_spraycan, None},            /* GLUT_CURSOR_SPRAY */
00026   {XC_watch, None},               /* GLUT_CURSOR_WAIT */
00027   {XC_xterm, None},               /* GLUT_CURSOR_TEXT */
00028   {XC_crosshair, None},           /* GLUT_CURSOR_CROSSHAIR */
00029   {XC_sb_v_double_arrow, None},   /* GLUT_CURSOR_UP_DOWN */
00030   {XC_sb_h_double_arrow, None},   /* GLUT_CURSOR_LEFT_RIGHT */
00031   {XC_top_side, None},            /* GLUT_CURSOR_TOP_SIDE */
00032   {XC_bottom_side, None},         /* GLUT_CURSOR_BOTTOM_SIDE */
00033   {XC_left_side, None},           /* GLUT_CURSOR_LEFT_SIDE */
00034   {XC_right_side, None},          /* GLUT_CURSOR_RIGHT_SIDE */
00035   {XC_top_left_corner, None},     /* GLUT_CURSOR_TOP_LEFT_CORNER */
00036   {XC_top_right_corner, None},    /* GLUT_CURSOR_TOP_RIGHT_CORNER */
00037   {XC_bottom_right_corner, None}, /* GLUT_CURSOR_BOTTOM_RIGHT_CORNER */
00038   {XC_bottom_left_corner, None},  /* GLUT_CURSOR_BOTTOM_LEFT_CORNER */
00039 };
00040 
00041 static Cursor blankCursor = None;
00042 static Cursor fullCrosshairCusor = None;
00043 
00044 static Cursor
00045 getFullCrosshairCursor(void)
00046 {
00047   Cursor cursor;
00048   Atom crosshairAtom, actualType;
00049   int rc, actualFormat;
00050   unsigned long n, left;
00051   unsigned long *value;
00052 
00053   if (fullCrosshairCusor == None) {
00054     crosshairAtom = XInternAtom(__glutDisplay,
00055       "_SGI_CROSSHAIR_CURSOR", True);
00056     if (crosshairAtom != None) {
00057       value = 0;        /* Make compiler happy. */
00058       rc = XGetWindowProperty(__glutDisplay, __glutRoot,
00059         crosshairAtom, 0, 1, False, XA_CURSOR, &actualType,
00060         &actualFormat, &n, &left, (unsigned char **) &value);
00061       if (rc == Success && actualFormat == 32 && n >= 1) {
00062         cursor = value[0];
00063         XFree(value);
00064         return cursor;
00065       }
00066     }
00067   }
00068   return XCreateFontCursor(__glutDisplay, XC_crosshair);
00069 }
00070 
00071 static Cursor
00072 makeBlankCursor(void)
00073 {
00074   static char data[1] =
00075   {0};
00076   Cursor cursor;
00077   Pixmap blank;
00078   XColor dummy;
00079 
00080   blank = XCreateBitmapFromData(__glutDisplay, __glutRoot,
00081     data, 1, 1);
00082   if (blank == None)
00083     __glutFatalError("out of memory.");
00084   cursor = XCreatePixmapCursor(__glutDisplay, blank, blank,
00085     &dummy, &dummy, 0, 0);
00086   XFreePixmap(__glutDisplay, blank);
00087 
00088   return cursor;
00089 }
00090 
00091 void
00092 glutSetCursor(int cursor)
00093 {
00094   Cursor xcursor;
00095 
00096   if (cursor >= 0 &&
00097     cursor < sizeof(cursorTable) / sizeof(cursorTable[0])) {
00098     if (cursorTable[cursor].cursor == None)
00099       cursorTable[cursor].cursor = XCreateFontCursor(__glutDisplay,
00100         cursorTable[cursor].glyph);
00101     xcursor = cursorTable[cursor].cursor;
00102   } else {
00103     /* Special cases. */
00104     switch (cursor) {
00105     case GLUT_CURSOR_INHERIT:
00106       xcursor = None;
00107       break;
00108     case GLUT_CURSOR_NONE:
00109       if (blankCursor == None)
00110         blankCursor = makeBlankCursor();
00111       xcursor = blankCursor;
00112       break;
00113     case GLUT_CURSOR_FULL_CROSSHAIR:
00114       if (fullCrosshairCusor == None)
00115         fullCrosshairCusor = getFullCrosshairCursor();
00116       xcursor = fullCrosshairCusor;
00117       break;
00118     }
00119   }
00120   __glutCurrentWindow->cursor = cursor;
00121   XDefineCursor(__glutDisplay,
00122     __glutCurrentWindow->win, xcursor);
00123   XFlush(__glutDisplay);
00124 }
 

Powered by Plone

This site conforms to the following standards: