/* =========================================== * Spaceware event handler library. MRH 24-Apr-2002 * =========================================== * * int mrh_space_event_handler(Display* display, Window window, XEvent* event) * void mrh_get_space_motion(int data[6]) * void mrh_get_space_buttons(int local_buttons[15]) * */ #include "math.h" #include "stdio.h" #include "X11/Xlib.h" #include "X11/Xutil.h" #include "X11/Xos.h" #include "X11/Xatom.h" #include "X11/keysym.h" #include "GL/glut.h" #include "xdrvlib.h" static int tx,ty,tz,rx,ry,rz; static int buttons[15]; /* The event handler */ int mrh_space_event_handler(Display* display, Window window, XEvent* event) { MagellanFloatEvent MagellanEvent; static int spaceware_running = 0; int event_type; if(event->type == ClientMessage) { if(!spaceware_running) { if(!MagellanInit(display, window)) return(1); /* No driver running. Throw away event */ else spaceware_running = 1; } event_type = MagellanTranslateEvent( display, event, &MagellanEvent, 1.0, 1.0 ); switch(event_type) { case MagellanInputMotionEvent: rx = (int)(-MagellanEvent.MagellanData[ MagellanA ]); ry = (int)(-MagellanEvent.MagellanData[ MagellanB ]); rz = (int)(MagellanEvent.MagellanData[ MagellanC ]); tx = (int)MagellanEvent.MagellanData[ MagellanX ]; ty = (int)MagellanEvent.MagellanData[ MagellanY ]; tz = (int)-MagellanEvent.MagellanData[ MagellanZ ]; return(1); case MagellanInputButtonPressEvent: buttons[MagellanEvent.MagellanButton] = 1; return(1); case MagellanInputButtonReleaseEvent: buttons[MagellanEvent.MagellanButton] = 0; return(1); default : break; } } return(0); /* Event not processed */ } void mrh_get_space_motion(int data[6]) { /* So we can pick up data when this code is in another file */ data[0] = rx; data[1] = ry; data[2] = rz; data[3] = tx; data[4] = ty; data[5] = tz; }; void mrh_get_space_buttons(int local_buttons[15]) { /* So we can pick up data when this code is in another file */ int i; for(i=0;i<15;i++) { local_buttons[i] = buttons[i]; } };