home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / tutorials / custEducation / opengl1 / lib / mouse.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  4.1 KB  |  147 lines

  1. /*
  2.  * Copyright 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17.  
  18.  
  19. #include <aux.h>
  20. #include <auxPrivate.h>
  21.  
  22.  
  23. /**************************************************************************
  24.  *   auxMouseFunc() - set mouse callback functions
  25.  **************************************************************************/
  26.  
  27. GLvoid
  28. auxMouseFunc( GLint mouseButton, GLint direction,
  29.     GLvoid (*_mouseFunc)( AUX_EVENTREC * ) )
  30. {
  31.     MouseFunc         *new;
  32.  
  33.     new = (MouseFunc *) malloc( sizeof( MouseFunc ) );
  34.  
  35.     new->func = _mouseFunc;
  36.     new->prev = (MouseFunc *) NULL;
  37.     new->next = (MouseFunc *) NULL;
  38.  
  39.     if ( mouseButton == AUX_MOUSELOC ) {
  40.         if ( !mouseLoc )
  41.             mouseLoc = new;
  42.         else {
  43.             new->next = mouseLoc;
  44.             mouseLoc->prev = new;
  45.             mouseLoc = new;
  46.         }
  47.     } else {
  48.         if ( direction == AUX_MOUSEDOWN ) {
  49.             if ( !mouseDown[mouseButton - AUX_BUTTON_MASK] )
  50.                 mouseDown[mouseButton - AUX_BUTTON_MASK] = new;
  51.             else {
  52.                 new->next = mouseDown[mouseButton - AUX_BUTTON_MASK];
  53.                 mouseDown[mouseButton - AUX_BUTTON_MASK]->prev = new;
  54.                 mouseDown[mouseButton - AUX_BUTTON_MASK] = new;
  55.             }    
  56.         } else { 
  57.             if ( !mouseUp[mouseButton - AUX_BUTTON_MASK] )
  58.                 mouseUp[mouseButton - AUX_BUTTON_MASK] = new;
  59.             else {
  60.                 new->next = mouseUp[mouseButton - AUX_BUTTON_MASK];
  61.                 mouseUp[mouseButton - AUX_BUTTON_MASK]->prev = new;
  62.                 mouseUp[mouseButton - AUX_BUTTON_MASK] = new;
  63.             }
  64.         }    
  65.     }
  66. }
  67.  
  68.  
  69. /**************************************************************************
  70.  *   auxDeleteMouseFunc() - remove mouse callback functions
  71.  **************************************************************************/
  72.  
  73. static GLvoid
  74. DeleteMouseFunction( MouseFunc **list, GLvoid (*_mouseFunc)( AUX_EVENTREC * ) )
  75. {
  76.     MouseFunc     *tmp;
  77.  
  78.     if ( !list )
  79.         return;
  80.  
  81.     for ( tmp = *list; tmp; tmp = tmp->next )
  82.         if ( tmp->func == _mouseFunc )
  83.             if ( !tmp->prev && !tmp->next )         /* Only element in list */
  84.                 *list = (MouseFunc *) NULL;
  85.             else if ( !tmp->prev ) {                /* Front of list */
  86.                 *list = tmp->next;
  87.                 (*list)->prev = (MouseFunc *) NULL;
  88.             } else if ( !tmp->next )                /* End of list */
  89.                 tmp->prev->next = (MouseFunc *) NULL;
  90.             else {
  91.                 tmp->prev->next = tmp->next;
  92.                 tmp->next->prev = tmp->prev;
  93.             }
  94.     free( tmp );
  95. }
  96.  
  97. GLvoid
  98. auxDeleteMouseFunc( GLint mouseButton, GLint direction,
  99.     GLvoid (*_mouseFunc)( AUX_EVENTREC * ) )
  100. {
  101.     if ( mouseButton == AUX_MOUSELOC ) {
  102.         DeleteMouseFunction( &mouseLoc, _mouseFunc );
  103.     } else {
  104.         if ( direction == AUX_MOUSEDOWN )
  105.             DeleteMouseFunction( &mouseDown[mouseButton - AUX_BUTTON_MASK],
  106.              _mouseFunc );
  107.         else
  108.             DeleteMouseFunction( &mouseUp[mouseButton - AUX_BUTTON_MASK],
  109.              _mouseFunc );
  110.     }
  111. }
  112.  
  113.  
  114. /**************************************************************************
  115.  *   auxDeleteAllMouseFunc() - remove mouse callback functions
  116.  **************************************************************************/
  117.  
  118. GLvoid
  119. auxDeleteAllMouseFunc( GLint mouseButton, GLint direction )
  120. {
  121.     MouseFunc     *tmp;
  122.  
  123.     if ( mouseButton == AUX_MOUSELOC ) {
  124.         tmp = mouseLoc;
  125.         mouseLoc = (MouseFunc *) NULL;
  126.     } else {
  127.         if ( direction == AUX_MOUSEDOWN ) {
  128.             tmp = mouseDown[mouseButton - AUX_BUTTON_MASK];
  129.             mouseDown[mouseButton - AUX_BUTTON_MASK] = (MouseFunc *) NULL;
  130.         } else {
  131.             tmp = mouseUp[mouseButton - AUX_BUTTON_MASK];
  132.             mouseUp[mouseButton - AUX_BUTTON_MASK] = (MouseFunc *) NULL;
  133.         }
  134.     }
  135.  
  136.     if ( !tmp->prev && !tmp->next )    /* Only element in function list */
  137.         free( tmp );
  138.     else {
  139.         MouseFunc  *next;
  140.         while ( tmp ) {
  141.             next = tmp->next;
  142.             free( tmp );
  143.             tmp = next;
  144.         }
  145.     }
  146. }
  147.