void EventHandler::_processEvent( WindowEvent& event ) { LB_TS_THREAD( _thread ); XEvent& xEvent = event.xEvent; XID drawable = xEvent.xany.window; if( _window->getXDrawable() != drawable ) return; eq::Window* window = _window->getWindow(); switch( xEvent.type ) { case Expose: if( xEvent.xexpose.count ) // Only report last expose event return; event.type = Event::WINDOW_EXPOSE; break; case ConfigureNotify: event.type = Event::WINDOW_RESIZE; _getWindowSize( xEvent.xany.display, drawable, event.resize ); break; case UnmapNotify: event.type = Event::WINDOW_HIDE; _getWindowSize( xEvent.xany.display, drawable, event.resize ); break; case MapNotify: event.type = Event::WINDOW_SHOW; _getWindowSize( xEvent.xany.display, drawable, event.resize ); break; case ClientMessage: { #ifdef EQUALIZER_USE_MAGELLAN_GLX spnav_event spev; /* spacenav event */ if( spnav_x11_event( &xEvent, &spev )) { switch( spev.type ) { case SPNAV_EVENT_MOTION: event.type = Event::MAGELLAN_AXIS; event.magellan.xAxis = spev.motion.x; event.magellan.yAxis = spev.motion.y; event.magellan.zAxis = -spev.motion.z; event.magellan.xRotation = -spev.motion.rx; event.magellan.yRotation = -spev.motion.ry; event.magellan.zRotation = spev.motion.rz; break; case SPNAV_EVENT_BUTTON: event.type = Event::MAGELLAN_BUTTON; event.magellan.buttons = spev.button.press; event.magellan.button = spev.button.bnum; break; default: LBUNIMPLEMENTED; return; } /* remove any other queued motion events */ //? spnav_remove_events( SPNAV_EVENT_MOTION ); break; } #endif Atom deleteAtom = XInternAtom( xEvent.xany.display, "WM_DELETE_WINDOW", False ); if( static_cast<Atom>( xEvent.xclient.data.l[0] ) != deleteAtom ) return; // not a delete message, ignore. } // else: delete message, fall through case DestroyNotify: event.type = Event::WINDOW_CLOSE; break; case MotionNotify: event.type = Event::WINDOW_POINTER_MOTION; event.pointerMotion.x = xEvent.xmotion.x; event.pointerMotion.y = xEvent.xmotion.y; event.pointerMotion.buttons = _getButtonState( xEvent ); event.pointerMotion.button = PTR_BUTTON_NONE; _computePointerDelta( window, event ); _getRenderContext( window, event ); break; case ButtonPress: event.type = Event::WINDOW_POINTER_BUTTON_PRESS; event.pointerButtonPress.x = xEvent.xbutton.x; event.pointerButtonPress.y = xEvent.xbutton.y; event.pointerButtonPress.buttons = _getButtonState( xEvent ); event.pointerButtonPress.button = _getButtonAction( xEvent ); // Translate wheel events switch( event.pointerButtonPress.button ) { case PTR_BUTTON4: event.pointerWheel.xAxis = 1; break; case PTR_BUTTON5: event.pointerWheel.xAxis = -1; break; case PTR_BUTTON6: event.pointerWheel.yAxis = 1; break; case PTR_BUTTON7: event.pointerWheel.yAxis = -1; break; } switch( event.pointerButtonPress.button ) { case PTR_BUTTON4: case PTR_BUTTON5: case PTR_BUTTON6: case PTR_BUTTON7: event.type = Event::WINDOW_POINTER_WHEEL; event.pointerWheel.button = PTR_BUTTON_NONE; } _computePointerDelta( window, event ); _getRenderContext( window, event ); break; case ButtonRelease: event.type = Event::WINDOW_POINTER_BUTTON_RELEASE; event.pointerButtonRelease.x = xEvent.xbutton.x; event.pointerButtonRelease.y = xEvent.xbutton.y; event.pointerButtonRelease.buttons = _getButtonState( xEvent ); event.pointerButtonRelease.button = _getButtonAction( xEvent); _computePointerDelta( window, event ); _getRenderContext( window, event ); break; case KeyPress: event.type = Event::KEY_PRESS; event.keyPress.key = _getKey( xEvent ); break; case KeyRelease: event.type = Event::KEY_RELEASE; event.keyPress.key = _getKey( xEvent ); break; case ReparentNotify: case VisibilityNotify: event.type = Event::UNKNOWN; LBVERB << "Ignored X event, type " << xEvent.type << std::endl; break; default: event.type = Event::UNKNOWN; LBWARN << "Unhandled X event, type " << xEvent.type << std::endl; break; } event.originator = window->getID(); event.serial = window->getSerial(); _window->processEvent( event ); }
void GLXEventHandler::_processEvent( GLXWindowEvent& event ) { EQ_TS_THREAD( _thread ); XEvent& xEvent = event.xEvent; XID drawable = xEvent.xany.window; if( _window->getXDrawable() != drawable ) return; Window* window = _window->getWindow(); switch( xEvent.type ) { case Expose: if( xEvent.xexpose.count ) // Only report last expose event return; event.type = Event::WINDOW_EXPOSE; break; case ConfigureNotify: event.type = Event::WINDOW_RESIZE; _getWindowSize( xEvent.xany.display, drawable, event.resize ); break; case UnmapNotify: event.type = Event::WINDOW_HIDE; _getWindowSize( xEvent.xany.display, drawable, event.resize ); break; case MapNotify: event.type = Event::WINDOW_SHOW; _getWindowSize( xEvent.xany.display, drawable, event.resize ); break; case ClientMessage: { Atom deleteAtom = XInternAtom( xEvent.xany.display, "WM_DELETE_WINDOW", False ); if( static_cast<Atom>( xEvent.xclient.data.l[0] ) != deleteAtom ) return; // not a delete message, ignore. } // else: delete message, fall through case DestroyNotify: event.type = Event::WINDOW_CLOSE; break; case MotionNotify: event.type = Event::WINDOW_POINTER_MOTION; event.pointerMotion.x = xEvent.xmotion.x; event.pointerMotion.y = xEvent.xmotion.y; event.pointerMotion.buttons = _getButtonState( xEvent ); event.pointerMotion.button = PTR_BUTTON_NONE; _computePointerDelta( window, event ); _getRenderContext( window, event ); break; case ButtonPress: event.type = Event::WINDOW_POINTER_BUTTON_PRESS; event.pointerButtonPress.x = xEvent.xbutton.x; event.pointerButtonPress.y = xEvent.xbutton.y; event.pointerButtonPress.buttons = _getButtonState( xEvent ); event.pointerButtonPress.button = _getButtonAction( xEvent ); // Translate wheel events switch( event.pointerButtonPress.button ) { case PTR_BUTTON4: event.pointerWheel.xAxis = 1; break; case PTR_BUTTON5: event.pointerWheel.xAxis = -1; break; case PTR_BUTTON6: event.pointerWheel.yAxis = 1; break; case PTR_BUTTON7: event.pointerWheel.yAxis = -1; break; } switch( event.pointerButtonPress.button ) { case PTR_BUTTON4: case PTR_BUTTON5: case PTR_BUTTON6: case PTR_BUTTON7: event.type = Event::WINDOW_POINTER_WHEEL; event.pointerWheel.button = PTR_BUTTON_NONE; } _computePointerDelta( window, event ); _getRenderContext( window, event ); break; case ButtonRelease: event.type = Event::WINDOW_POINTER_BUTTON_RELEASE; event.pointerButtonRelease.x = xEvent.xbutton.x; event.pointerButtonRelease.y = xEvent.xbutton.y; event.pointerButtonRelease.buttons = _getButtonState( xEvent ); event.pointerButtonRelease.button = _getButtonAction( xEvent); _computePointerDelta( window, event ); _getRenderContext( window, event ); break; case KeyPress: event.type = Event::KEY_PRESS; event.keyPress.key = _getKey( xEvent ); break; case KeyRelease: event.type = Event::KEY_RELEASE; event.keyPress.key = _getKey( xEvent ); break; case ReparentNotify: case VisibilityNotify: event.type = Event::UNKNOWN; EQINFO << "Ignored X event, type " << xEvent.type << std::endl; break; default: event.type = Event::UNKNOWN; EQWARN << "Unhandled X event, type " << xEvent.type << std::endl; break; } event.originator = window->getID(); event.serial = window->getSerial(); _window->processEvent( event ); }
LRESULT CALLBACK EventHandler::_wndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { WindowEvent event; event.uMsg = uMsg; event.wParam = wParam; event.lParam = lParam; event.time = _window->getConfig()->getTime(); eq::Window* const window = _window->getWindow(); LONG result = 0; switch( uMsg ) { case WM_SHOWWINDOW: if( wParam == TRUE ) event.type = Event::WINDOW_SHOW; else event.type = Event::WINDOW_HIDE; _getWindowSize( hWnd, event.resize ); break; case WM_CREATE: case WM_SIZE: case WM_MOVE: case WM_WINDOWPOSCHANGED: { _getWindowSize( hWnd, event.resize ); const bool hasArea = (event.resize.w >0 && event.resize.h > 0); const PixelViewport& pvp = window->getPixelViewport(); // No show/hide events on Win32?: Emulate. if( !hasArea && pvp.hasArea( )) event.type = Event::WINDOW_HIDE; else if( hasArea && !pvp.hasArea( )) event.type = Event::WINDOW_SHOW; else event.type = Event::WINDOW_RESIZE; break; } case WM_CLOSE: case WM_DESTROY: event.type = Event::WINDOW_CLOSE; break; case WM_PAINT: { if( GetUpdateRect( hWnd, 0, false ) == 0 ) // No 'expose' return DefWindowProc( hWnd, uMsg, wParam, lParam ); event.type = Event::WINDOW_EXPOSE; break; } case WM_MOUSEMOVE: { _syncButtonState( wParam ); event.type = Event::WINDOW_POINTER_MOTION; event.pointerMotion.x = GET_X_LPARAM( lParam ); event.pointerMotion.y = GET_Y_LPARAM( lParam ); event.pointerMotion.buttons = _buttonState; _computePointerDelta( window, event ); _getRenderContext( window, event ); break; } case WM_LBUTTONDOWN: _buttonState |= PTR_BUTTON1; event.type = Event::WINDOW_POINTER_BUTTON_PRESS; event.pointerButtonPress.x = GET_X_LPARAM( lParam ); event.pointerButtonPress.y = GET_Y_LPARAM( lParam ); event.pointerButtonPress.buttons = _buttonState; event.pointerButtonPress.button = PTR_BUTTON1; _computePointerDelta( window, event ); _getRenderContext( window, event ); break; case WM_MBUTTONDOWN: _buttonState |= PTR_BUTTON2; event.type = Event::WINDOW_POINTER_BUTTON_PRESS; event.pointerButtonPress.x = GET_X_LPARAM( lParam ); event.pointerButtonPress.y = GET_Y_LPARAM( lParam ); event.pointerButtonPress.buttons = _buttonState; event.pointerButtonPress.button = PTR_BUTTON2; _computePointerDelta( window, event ); _getRenderContext( window, event ); break; case WM_RBUTTONDOWN: _buttonState |= PTR_BUTTON3; event.type = Event::WINDOW_POINTER_BUTTON_PRESS; event.pointerButtonPress.x = GET_X_LPARAM( lParam ); event.pointerButtonPress.y = GET_Y_LPARAM( lParam ); event.pointerButtonPress.buttons = _buttonState; event.pointerButtonPress.button = PTR_BUTTON3; _computePointerDelta( window, event ); _getRenderContext( window, event ); break; case WM_XBUTTONDOWN: event.type = Event::WINDOW_POINTER_BUTTON_PRESS; event.pointerButtonPress.x = GET_X_LPARAM( lParam ); event.pointerButtonPress.y = GET_Y_LPARAM( lParam ); if( GET_XBUTTON_WPARAM( wParam ) & XBUTTON1 ) event.pointerButtonRelease.button = PTR_BUTTON4; else event.pointerButtonRelease.button = PTR_BUTTON5; _buttonState |= event.pointerButtonPress.button; _syncButtonState( GET_KEYSTATE_WPARAM( wParam )); event.pointerButtonPress.buttons = _buttonState; _computePointerDelta( window, event ); _getRenderContext( window, event ); result = TRUE; break; case WM_LBUTTONUP: _buttonState &= ~PTR_BUTTON1; event.type = Event::WINDOW_POINTER_BUTTON_RELEASE; event.pointerButtonRelease.x = GET_X_LPARAM( lParam ); event.pointerButtonRelease.y = GET_Y_LPARAM( lParam ); event.pointerButtonRelease.buttons = _buttonState; event.pointerButtonRelease.button = PTR_BUTTON1; _computePointerDelta( window, event ); _getRenderContext( window, event ); break; case WM_MBUTTONUP: _buttonState &= ~PTR_BUTTON2; event.type = Event::WINDOW_POINTER_BUTTON_RELEASE; event.pointerButtonRelease.x = GET_X_LPARAM( lParam ); event.pointerButtonRelease.y = GET_Y_LPARAM( lParam ); event.pointerButtonRelease.buttons = _buttonState; event.pointerButtonRelease.button = PTR_BUTTON2; _computePointerDelta( window, event ); _getRenderContext( window, event ); break; case WM_RBUTTONUP: _buttonState &= ~PTR_BUTTON3; event.type = Event::WINDOW_POINTER_BUTTON_RELEASE; event.pointerButtonRelease.x = GET_X_LPARAM( lParam ); event.pointerButtonRelease.y = GET_Y_LPARAM( lParam ); event.pointerButtonRelease.buttons = _buttonState; event.pointerButtonRelease.button = PTR_BUTTON3; _computePointerDelta( window, event ); _getRenderContext( window, event ); break; case WM_XBUTTONUP: event.type = Event::WINDOW_POINTER_BUTTON_RELEASE; event.pointerButtonRelease.x = GET_X_LPARAM( lParam ); event.pointerButtonRelease.y = GET_Y_LPARAM( lParam ); if( GET_XBUTTON_WPARAM( wParam ) & XBUTTON1 ) event.pointerButtonRelease.button = PTR_BUTTON4; else event.pointerButtonRelease.button = PTR_BUTTON5; _buttonState &= ~event.pointerButtonRelease.button; _syncButtonState( GET_KEYSTATE_WPARAM( wParam )); event.pointerButtonRelease.buttons =_buttonState; _computePointerDelta( window, event ); _getRenderContext( window, event ); result = TRUE; break; case WM_MOUSEWHEEL: event.type = Event::WINDOW_POINTER_WHEEL; event.pointerWheel.x = GET_X_LPARAM( lParam ); event.pointerWheel.y = GET_Y_LPARAM( lParam ); event.pointerWheel.buttons = _buttonState; event.pointerWheel.xAxis = _getWheelDelta( wParam ); break; #ifdef WM_MOUSEHWHEEL // only available on vista or later case WM_MOUSEHWHEEL: event.type = Event::WINDOW_POINTER_WHEEL; event.pointerWheel.x = GET_X_LPARAM( lParam ); event.pointerWheel.y = GET_Y_LPARAM( lParam ); event.pointerWheel.buttons = _buttonState; event.pointerWheel.yAxis = _getWheelDelta( wParam ); break; #endif case WM_SYSKEYDOWN: case WM_KEYDOWN: event.type = Event::KEY_PRESS; event.keyPress.key = _getKey( lParam, wParam ); break; case WM_SYSKEYUP: case WM_KEYUP: event.type = Event::KEY_RELEASE; event.keyRelease.key = _getKey( lParam, wParam ); break; case WM_SYSCOMMAND: switch( wParam ) { case SC_MONITORPOWER: case SC_SCREENSAVE: if( lParam >= 0 ) // request off { event.type = Event::WINDOW_SCREENSAVER; break; } // else no break; fall through default: event.type = Event::UNKNOWN; LBVERB << "Unhandled system command 0x" << std::hex << wParam << std::dec << std::endl; break; } break; #ifdef EQUALIZER_USE_MAGELLAN case WM_INPUT: _magellanEventHandler( lParam ); break; #endif default: event.type = Event::UNKNOWN; LBVERB << "Unhandled message 0x" << std::hex << uMsg << std::dec << std::endl; break; } LBASSERT( window->getID() != 0 ); event.originator = window->getID(); event.serial = window->getSerial(); if( _window->processEvent( event )) return result; return CallWindowProc( _prevWndProc, hWnd, uMsg, wParam, lParam ); }