LRESULT CALLBACK EventHandler::_wndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_SHOWWINDOW: { SizeEvent sizeEvent; _getWindowSize(hWnd, sizeEvent); EventType type = wParam == TRUE ? EVENT_WINDOW_SHOW : EVENT_WINDOW_HIDE; if (_window->processEvent(type, sizeEvent)) return TRUE; break; } case WM_CREATE: case WM_SIZE: case WM_MOVE: case WM_WINDOWPOSCHANGED: { SizeEvent sizeEvent; _getWindowSize(hWnd, sizeEvent); const bool hasArea = (sizeEvent.w > 0 && sizeEvent.h > 0); const PixelViewport& pvp = _window->getPixelViewport(); // No show/hide events on Win32?: Emulate. EventType type; if (!hasArea && pvp.hasArea()) type = EVENT_WINDOW_HIDE; else if (hasArea && !pvp.hasArea()) type = EVENT_WINDOW_SHOW; else type = EVENT_WINDOW_RESIZE; if (_window->processEvent(type, sizeEvent)) return TRUE; break; } case WM_CLOSE: case WM_DESTROY: { if (_window->processEvent(EVENT_WINDOW_CLOSE)) return TRUE; break; } case WM_PAINT: { if (GetUpdateRect(hWnd, 0, false) == 0) // No 'expose' return DefWindowProc(hWnd, uMsg, wParam, lParam); if (_window->processEvent(EVENT_WINDOW_EXPOSE)) return TRUE; break; } case WM_MOUSEMOVE: { _syncButtonState(wParam); PointerEvent pointerEvent; pointerEvent.x = GET_X_LPARAM(lParam); pointerEvent.y = GET_Y_LPARAM(lParam); pointerEvent.buttons = _buttonState; _computePointerDelta(EVENT_WINDOW_POINTER_MOTION, pointerEvent); if (_window->processEvent(EVENT_WINDOW_POINTER_MOTION, pointerEvent)) return TRUE; break; } case WM_LBUTTONDOWN: if (_mouseButtonPress(PTR_BUTTON1, lParam)) return TRUE; break; case WM_RBUTTONDOWN: if (_mouseButtonPress(PTR_BUTTON2, lParam)) return TRUE; break; case WM_MBUTTONDOWN: if (_mouseButtonPress(PTR_BUTTON3, lParam)) return TRUE; break; case WM_XBUTTONDOWN: { const PointerButton button = GET_XBUTTON_WPARAM(wParam) & XBUTTON1 ? PTR_BUTTON4 : PTR_BUTTON5; _syncButtonState(GET_XBUTTON_WPARAM(wParam)); if (_mouseButtonPress(button, lParam)) return TRUE; break; } case WM_LBUTTONUP: if (_mouseButtonRelease(PTR_BUTTON1, lParam)) return TRUE; break; case WM_RBUTTONUP: if (_mouseButtonRelease(PTR_BUTTON2, lParam)) return TRUE; break; case WM_MBUTTONUP: if (_mouseButtonRelease(PTR_BUTTON3, lParam)) return TRUE; break; case WM_XBUTTONUP: { const PointerButton button = GET_XBUTTON_WPARAM(wParam) & XBUTTON1 ? PTR_BUTTON4 : PTR_BUTTON5; _syncButtonState(GET_XBUTTON_WPARAM(wParam)); if (_mouseButtonRelease(button, lParam)) return TRUE; break; } case WM_MOUSEWHEEL: { PointerEvent pointerEvent; pointerEvent.x = GET_X_LPARAM(lParam); pointerEvent.y = GET_Y_LPARAM(lParam); pointerEvent.buttons = _buttonState; pointerEvent.modifiers = _getKeyModifiers(); pointerEvent.yAxis = _getWheelDelta(wParam); pointerEvent.button = PTR_BUTTON_NONE; _computePointerDelta(EVENT_WINDOW_POINTER_WHEEL, pointerEvent); if (_window->processEvent(EVENT_WINDOW_POINTER_WHEEL, pointerEvent)) return TRUE; break; } #ifdef WM_MOUSEHWHEEL // only available on vista or later case WM_MOUSEHWHEEL: { PointerEvent pointerEvent; pointerEvent.x = GET_X_LPARAM(lParam); pointerEvent.y = GET_Y_LPARAM(lParam); pointerEvent.buttons = _buttonState; pointerEvent.modifiers = _getKeyModifiers(); pointerEvent.xAxis = _getWheelDelta(wParam); pointerEvent.button = PTR_BUTTON_NONE; _computePointerDelta(EVENT_WINDOW_POINTER_WHEEL, pointerEvent); if (_window->processEvent(EVENT_WINDOW_POINTER_WHEEL, pointerEvent)) return TRUE; break; } #endif case WM_SYSKEYDOWN: case WM_KEYDOWN: { KeyEvent keyEvent; keyEvent.key = _getKey(lParam, wParam); keyEvent.modifiers = _getKeyModifiers(); if (_window->processEvent(EVENT_KEY_PRESS, keyEvent)) return TRUE; break; } case WM_SYSKEYUP: case WM_KEYUP: { KeyEvent keyEvent; keyEvent.key = _getKey(lParam, wParam); keyEvent.modifiers = _getKeyModifiers(); if (_window->processEvent(EVENT_KEY_RELEASE, keyEvent)) return TRUE; break; } case WM_SYSCOMMAND: switch (wParam) { case SC_MONITORPOWER: case SC_SCREENSAVE: if (lParam >= 0) // request off { if (_window->processEvent(EVENT_WINDOW_SCREENSAVER)) return TRUE; break; } // else no break; fall through default: _window->processEvent(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: _window->processEvent(EVENT_UNKNOWN); LBVERB << "Unhandled message 0x" << std::hex << uMsg << std::dec << std::endl; break; } return CallWindowProc(_prevWndProc, hWnd, uMsg, wParam, lParam); }
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 ); }