Changeset 93 for trunk/src/gl


Ignore:
Timestamp:
06/03/13 00:44:38 (12 years ago)
Author:
epyon
Message:
  • io_event - event and key list expanded
  • window - is_event_pending, poll_event, swap_buffers added to interface
  • gl_window - implementations of the above, SDL_Event translation
  • render_test - no longer directly using any foreign libs
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/gl/gl_window.cc

    r44 r93  
    1010
    1111using namespace nv;
     12
     13static bool sdl_key_event_to_io_event( const SDL_KeyboardEvent& ke, io_event& kevent )
     14{
     15        kevent.type        = EV_KEY;
     16        kevent.key.pressed = ( ke.state != SDL_RELEASED );
     17        kevent.key.ascii   = 0;
     18        kevent.key.code    = KEY_NONE;
     19
     20        // if result is a typable char place it into the structure
     21        if (ke.keysym.unicode >= 32 && ke.keysym.unicode < 128 )
     22        {
     23                kevent.key.ascii = (char)ke.keysym.unicode;
     24        }
     25
     26        // Get the Key value from the SDL Keyboard event
     27        int result = ke.keysym.sym;
     28
     29        // Check the control and shift states
     30        kevent.key.alt     = (ke.keysym.mod & KMOD_ALT ) != 0;
     31        kevent.key.control = (ke.keysym.mod & KMOD_CTRL ) != 0;
     32        kevent.key.shift   = (ke.keysym.mod & KMOD_SHIFT ) != 0;
     33
     34        // if result is a typable char from the directly transformable ranges
     35        if ( ( result >= KEY_A && result <= KEY_Z ) ||
     36                ( result >= KEY_0 && result <= KEY_9 ) ||
     37                result == ' ' )
     38        {
     39                kevent.key.code = static_cast<key_code>(result);
     40        }
     41
     42        // if result is a typable char from the a..z range
     43        if ( result >= KEY_A + 32 && result <= KEY_Z + 32 )
     44        {
     45                kevent.key.code = static_cast<key_code>(result - 32);
     46        }
     47
     48        if ( result >= SDLK_F1 && result <= SDLK_F12 )
     49        {
     50                kevent.key.code = static_cast<key_code>(result - SDLK_F1 + KEY_F1 );
     51        }
     52
     53        // other recognized codes
     54        switch ( result )
     55        {
     56        case SDLK_BACKSPACE    : kevent.key.code = KEY_BACK; break;
     57        case SDLK_TAB          : kevent.key.code = KEY_TAB; break;
     58        case SDLK_RETURN       : kevent.key.code = KEY_ENTER; break;
     59        case SDLK_PAGEUP       : kevent.key.code = KEY_PGUP; break;
     60        case SDLK_PAGEDOWN     : kevent.key.code = KEY_PGDOWN; break;
     61        case SDLK_END          : kevent.key.code = KEY_END; break;
     62        case SDLK_HOME         : kevent.key.code = KEY_HOME; break;
     63        case SDLK_LEFT         : kevent.key.code = KEY_LEFT; break;
     64        case SDLK_UP           : kevent.key.code = KEY_UP; break;
     65        case SDLK_RIGHT        : kevent.key.code = KEY_RIGHT; break;
     66        case SDLK_DOWN         : kevent.key.code = KEY_DOWN; break;
     67        case SDLK_DELETE       : kevent.key.code = KEY_DELETE; break;
     68        case SDLK_INSERT       : kevent.key.code = KEY_INSERT; break;
     69        case SDLK_KP5          : kevent.key.code = KEY_CENTER; break;
     70        case SDLK_ESCAPE       : kevent.key.code = KEY_ESCAPE; break;
     71        case SDLK_QUOTE        : kevent.key.code = KEY_QUOTE; break;
     72        case SDLK_COMMA        : kevent.key.code = KEY_COMMA; break;
     73        case SDLK_MINUS        : kevent.key.code = KEY_MINUS; break;
     74        case SDLK_PERIOD       : kevent.key.code = KEY_PERIOD; break;
     75        case SDLK_SLASH        : kevent.key.code = KEY_SLASH; break;
     76        case SDLK_SEMICOLON    : kevent.key.code = KEY_SCOLON; break;
     77        case SDLK_LEFTBRACKET  : kevent.key.code = KEY_LBRACKET; break;
     78        case SDLK_BACKSLASH    : kevent.key.code = KEY_BSLASH; break;
     79        case SDLK_RIGHTBRACKET : kevent.key.code = KEY_RBRACKET; break;
     80        case SDLK_BACKQUOTE    : kevent.key.code = KEY_BQUOTE; break;
     81        default : break;
     82        }
     83
     84        // If key was understood by nv, then it's valid, otherwise ignored
     85        return kevent.key.ascii != 0 || kevent.key.code != 0;
     86}
     87
     88static bool sdl_mouse_button_to_io_event( const SDL_MouseButtonEvent& mb, io_event& mevent )
     89{
     90        mevent.type            = EV_MOUSE_BUTTON;
     91        mevent.mbutton.button  = MOUSE_NONE;
     92        mevent.mbutton.pressed = (mb.state != SDL_RELEASED);
     93        mevent.mbutton.x       = mb.x;
     94        mevent.mbutton.y       = mb.y;
     95
     96        switch ( mb.button )
     97        {
     98        case SDL_BUTTON_LEFT      : mevent.mbutton.button = MOUSE_LEFT; break;
     99        case SDL_BUTTON_MIDDLE    : mevent.mbutton.button = MOUSE_MIDDLE; break;
     100        case SDL_BUTTON_RIGHT     : mevent.mbutton.button = MOUSE_RIGHT; break;
     101        case SDL_BUTTON_WHEELUP   : mevent.mbutton.button = MOUSE_WHEEL_UP; break;
     102        case SDL_BUTTON_WHEELDOWN : mevent.mbutton.button = MOUSE_WHEEL_DOWN; break;
     103        default : break;
     104        }
     105
     106        return mevent.mbutton.button != MOUSE_NONE;
     107}
     108
     109static bool sdl_mouse_motion_to_io_event( const SDL_MouseMotionEvent& mm, io_event& mevent )
     110{
     111        mevent.type          = EV_MOUSE_MOVE;
     112        mevent.mmove.pressed = (mm.state != SDL_RELEASED);
     113        mevent.mmove.x       = mm.x;
     114        mevent.mmove.y       = mm.y;
     115        return true;
     116}
     117
     118static bool sdl_event_to_io_event( const SDL_Event& e, io_event& ioevent )
     119{
     120        switch ( e.type )
     121        {
     122        case SDL_KEYDOWN         : return sdl_key_event_to_io_event( e.key, ioevent );
     123        case SDL_KEYUP           : return sdl_key_event_to_io_event( e.key, ioevent );
     124        case SDL_MOUSEMOTION     : return sdl_mouse_motion_to_io_event( e.motion, ioevent );
     125        case SDL_MOUSEBUTTONDOWN : return sdl_mouse_button_to_io_event( e.button, ioevent );
     126        case SDL_MOUSEBUTTONUP   : return sdl_mouse_button_to_io_event( e.button, ioevent );
     127        case SDL_ACTIVEEVENT     :
     128                ioevent.type = EV_ACTIVE;
     129                ioevent.active.gain = (e.active.gain != 0);
     130                return e.active.state == SDL_APPINPUTFOCUS;
     131        case SDL_VIDEORESIZE     :
     132                ioevent.type     = EV_RESIZE;
     133                ioevent.resize.x = e.resize.w;
     134                ioevent.resize.y = e.resize.h;
     135                return true;
     136        case SDL_SYSWMEVENT      : ioevent.type = EV_SYSTEM; return true;
     137        case SDL_QUIT            : ioevent.type = EV_QUIT;   return true;
     138        case SDL_NOEVENT         : return false;
     139        case SDL_VIDEOEXPOSE     : return false;
     140        case SDL_JOYAXISMOTION   : return false;
     141        case SDL_JOYBALLMOTION   : return false;
     142        case SDL_JOYHATMOTION    : return false;
     143        case SDL_JOYBUTTONDOWN   : return false;
     144        case SDL_JOYBUTTONUP     : return false;
     145        default : return false;
     146        }
     147}
     148
    12149
    13150gl_window::gl_window( uint16 width, uint16 height )
     
    55192}
    56193
     194bool gl_window::is_event_pending()
     195{
     196        return SDL_PollEvent( nullptr ) != 0;
     197}
     198
     199bool gl_window::poll_event( io_event& event )
     200{
     201        SDL_Event sdl_event;
     202        if ( SDL_PollEvent( &sdl_event ) == 0 ) return false;
     203        return sdl_event_to_io_event( sdl_event, event );
     204}
     205
     206void gl_window::swap_buffers()
     207{
     208        SDL_GL_SwapBuffers();
     209}
     210
    57211gl_window::~gl_window()
    58212{
Note: See TracChangeset for help on using the changeset viewer.