glutmui.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:6k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1993-1997, Silicon Graphics, Inc.
  3.  * ALL RIGHTS RESERVED 
  4.  * Permission to use, copy, modify, and distribute this software for 
  5.  * any purpose and without fee is hereby granted, provided that the above
  6.  * copyright notice appear in all copies and that both the copyright notice
  7.  * and this permission notice appear in supporting documentation, and that 
  8.  * the name of Silicon Graphics, Inc. not be used in advertising
  9.  * or publicity pertaining to distribution of the software without specific,
  10.  * written prior permission. 
  11.  *
  12.  * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
  13.  * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
  14.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
  15.  * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
  16.  * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
  17.  * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
  18.  * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
  19.  * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
  20.  * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
  21.  * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
  22.  * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
  23.  * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
  24.  * 
  25.  * US Government Users Restricted Rights 
  26.  * Use, duplication, or disclosure by the Government is subject to
  27.  * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
  28.  * (c)(1)(ii) of the Rights in Technical Data and Computer Software
  29.  * clause at DFARS 252.227-7013 and/or in similar or successor
  30.  * clauses in the FAR or the DOD or NASA FAR Supplement.
  31.  * Unpublished-- rights reserved under the copyright laws of the
  32.  * United States.  Contractor/manufacturer is Silicon Graphics,
  33.  * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
  34.  *
  35.  * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
  36.  */
  37. #include <stdlib.h>
  38. #include <GL/glut.h>
  39. #include <mui/gizmo.h>
  40. typedef struct _Window {
  41.   int mui_xorg, mui_yorg, mui_xsize, mui_ysize;
  42.   int uilist;
  43.   int mbleft;
  44. } WindowRec, *Window;
  45. static Window winList = NULL;
  46. static int numWins = 0;
  47. int mui_singlebuffered = 0;
  48. int menuinuse = 0;
  49. static int mbmiddle = 0, mbright = 0;  /* XXX unused currently */
  50. void setmousebuttons(int b, int s)
  51. {
  52.     Window win = &winList[glutGetWindow()-1];
  53.     switch (b) {
  54. case GLUT_LEFT_BUTTON:
  55.     win->mbleft = (s == GLUT_DOWN);
  56.     break;
  57. case GLUT_MIDDLE_BUTTON:
  58.     mbmiddle =(s == GLUT_DOWN);
  59.     break;
  60. case GLUT_RIGHT_BUTTON:
  61.     mbright =(s == GLUT_DOWN);
  62.     break;
  63.     }
  64. }
  65. void mui_drawgeom(void)
  66. {
  67.     Window win = &winList[glutGetWindow()-1];
  68.     glViewport(0, 0, win->mui_xsize, win->mui_ysize);
  69.     glMatrixMode(GL_PROJECTION);
  70.     glLoadIdentity();
  71.     gluOrtho2D(0, win->mui_xsize, 0, win->mui_ysize);
  72.     glMatrixMode(GL_MODELVIEW);
  73.     glLoadIdentity();
  74.     muiDrawUIList(win->uilist);
  75.     if (mui_singlebuffered == 0)
  76. glutSwapBuffers();
  77.     else
  78. glFlush();
  79. }
  80. void mui_keyboard(unsigned char c, int x, int y)
  81. {
  82.     Window win = &winList[glutGetWindow()-1];
  83.     muiSetActiveUIList(win->uilist);
  84.     muiHandleEvent(MUI_KEYSTROKE, c, x, win->mui_ysize-y);
  85.     glutPostRedisplay();
  86. }
  87. void mui_mouse(int b, int s, int x, int y)
  88. {
  89.     Window win = &winList[glutGetWindow()-1];
  90.     muiSetActiveUIList(win->uilist);
  91.     setmousebuttons(b, s);
  92.     if (b == GLUT_MIDDLE_BUTTON && s == GLUT_DOWN) {
  93. muiHandleEvent(MUI_DEVICE_DOUBLE_CLICK, 0, x, win->mui_ysize-y);
  94. glutPostRedisplay();
  95.     }
  96.     if (b != GLUT_LEFT_BUTTON) { return; }
  97.     muiHandleEvent((s==GLUT_DOWN)?MUI_DEVICE_PRESS:MUI_DEVICE_RELEASE, 0, x, win->mui_ysize-y);
  98.     glutPostRedisplay();
  99. }
  100. static void mui_Reshape(int width, int height)
  101. {
  102.     Window win = &winList[glutGetWindow()-1];
  103.     win->mui_xorg = glutGet(GLUT_WINDOW_X);
  104.     win->mui_yorg = glutGet(GLUT_WINDOW_Y);
  105.     win->mui_xsize = width;
  106.     win->mui_ysize = height;
  107.     glViewport(0, 0, win->mui_xsize, win->mui_ysize);
  108. }
  109. void mui_glutmotion(int x, int y)
  110. {
  111.     Window win = &winList[glutGetWindow()-1];
  112.     muiSetActiveUIList(win->uilist);
  113.     if (win->mbleft == 0) return;
  114.     muiHandleEvent(MUI_DEVICE_DOWN, 0, x, win->mui_ysize-y);
  115.     glutPostRedisplay();
  116. }
  117. void mui_glutpassivemotion(int x, int y)
  118. {
  119.     Window win = &winList[glutGetWindow()-1];
  120.     muiSetActiveUIList(win->uilist);
  121.     muiHandleEvent(MUI_DEVICE_UP, 0, x, win->mui_ysize-y);
  122.     glutPostRedisplay();
  123. }
  124. void mui_menufunc(int state)
  125. {
  126.     menuinuse = state;
  127. }
  128. void muiInit(void)
  129. {
  130.     int winNum = glutGetWindow();
  131.     Window win;
  132.     if (winNum >= numWins) {
  133.       numWins = winNum;
  134.       winList = (Window) realloc(winList, numWins * sizeof(WindowRec));
  135.     }
  136.     win = &winList[glutGetWindow()-1];
  137.     win->mui_xorg = glutGet(GLUT_WINDOW_X);
  138.     win->mui_yorg = glutGet(GLUT_WINDOW_Y);
  139.     win->mui_xsize = glutGet(GLUT_WINDOW_WIDTH);
  140.     win->mui_ysize = glutGet(GLUT_WINDOW_HEIGHT);;
  141.     win->mbleft = 0;
  142.     /* The "uilist = 1" is for compatibility with GLUT 3.5's MUI
  143.        implementation that was hardwired to support a single window
  144.        only with UI list 1. */
  145.     win->uilist = 1;
  146.     glutKeyboardFunc(mui_keyboard);
  147.     glutMouseFunc(mui_mouse);
  148.     glutReshapeFunc(mui_Reshape);
  149.     glutMotionFunc(mui_glutmotion);
  150.     glutPassiveMotionFunc(mui_glutpassivemotion);
  151.     glutDisplayFunc(mui_drawgeom);
  152.     glutMenuStateFunc(mui_menufunc);
  153. }
  154. void muiAttachUIList(int uilist)
  155. {
  156.   Window win = &winList[glutGetWindow()-1];
  157.   win->uilist = uilist;
  158. }