Example #1
0
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);
}
Example #2
0
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 );
}