source: trunk/src/sdl/sdl_input.cc @ 337

Last change on this file since 337 was 336, checked in by epyon, 11 years ago
  • added missing sdl module files
File size: 7.9 KB
Line 
1// Copyright (C) 2014 ChaosForge Ltd
2// http://chaosforge.org/
3//
4// This file is part of NV Libraries.
5// For conditions of distribution and use, see copyright notice in nv.hh
6
7#include "nv/sdl/sdl_input.hh"
8
9#include "nv/lib/sdl.hh"
10#include "nv/core/logging.hh"
11
12using namespace nv;
13
14nv::sdl::input::input()
15{
16        if ( ! SDL_WasInit( SDL_INIT_JOYSTICK ) ) SDL_InitSubSystem( SDL_INIT_JOYSTICK );
17}
18
19static bool sdl_key_event_to_io_event( const SDL_KeyboardEvent& ke, io_event& kevent )
20{
21        kevent.type        = EV_KEY;
22        kevent.key.pressed = ( ke.state != SDL_RELEASED );
23        kevent.key.ascii   = 0;
24        kevent.key.code    = KEY_NONE;
25
26        uint32 ucode = (uint32)ke.keysym.sym;
27
28        // if result is a typable char place it into the structure
29        if (ucode >= 32 && ucode < 128 )
30        {
31                kevent.key.ascii = static_cast<char8>( ucode );
32                if (ucode >= 'a' && ucode <= 'z')
33                {
34                        int shifted = !!(ke.keysym.mod & KMOD_SHIFT);
35                        int capslock = !!(ke.keysym.mod & KMOD_CAPS);
36                        if ((shifted ^ capslock) != 0) {
37                                kevent.key.ascii = (char8)SDL_toupper((int)ucode);
38                        }
39                }
40        }
41
42        // Get the Key value from the SDL Keyboard event
43        int result = ke.keysym.sym;
44
45        // Check the control and shift states
46        kevent.key.alt     = (ke.keysym.mod & KMOD_ALT ) != 0;
47        kevent.key.control = (ke.keysym.mod & KMOD_CTRL ) != 0;
48        kevent.key.shift   = (ke.keysym.mod & KMOD_SHIFT ) != 0;
49
50        // if result is a typable char from the directly transformable ranges
51        if ( ( result >= KEY_A && result <= KEY_Z ) ||
52                ( result >= KEY_0 && result <= KEY_9 ) ||
53                result == ' ' )
54        {
55                kevent.key.code = static_cast<key_code>(result);
56        }
57
58        // if result is a typable char from the a..z range
59        if ( result >= KEY_A + 32 && result <= KEY_Z + 32 )
60        {
61                kevent.key.code = static_cast<key_code>(result - 32);
62        }
63
64        if ( result >= SDLK_F1 && result <= SDLK_F12 )
65        {
66                kevent.key.code = static_cast<key_code>(result - SDLK_F1 + KEY_F1 );
67        }
68
69        // other recognized codes
70        switch ( result )
71        {
72        case SDLK_BACKSPACE    : kevent.key.code = KEY_BACK; break;
73        case SDLK_TAB          : kevent.key.code = KEY_TAB; break;
74        case SDLK_RETURN       : kevent.key.code = KEY_ENTER; break;
75        case SDLK_PAGEUP       : kevent.key.code = KEY_PGUP; break;
76        case SDLK_PAGEDOWN     : kevent.key.code = KEY_PGDOWN; break;
77        case SDLK_END          : kevent.key.code = KEY_END; break;
78        case SDLK_HOME         : kevent.key.code = KEY_HOME; break;
79        case SDLK_LEFT         : kevent.key.code = KEY_LEFT; break;
80        case SDLK_UP           : kevent.key.code = KEY_UP; break;
81        case SDLK_RIGHT        : kevent.key.code = KEY_RIGHT; break;
82        case SDLK_DOWN         : kevent.key.code = KEY_DOWN; break;
83        case SDLK_DELETE       : kevent.key.code = KEY_DELETE; break;
84        case SDLK_INSERT       : kevent.key.code = KEY_INSERT; break;
85        //case SDLK_KP5          : kevent.key.code = KEY_CENTER; break;
86        case SDLK_ESCAPE       : kevent.key.code = KEY_ESCAPE; break;
87        case SDLK_QUOTE        : kevent.key.code = KEY_QUOTE; break;
88        case SDLK_COMMA        : kevent.key.code = KEY_COMMA; break;
89        case SDLK_MINUS        : kevent.key.code = KEY_MINUS; break;
90        case SDLK_PERIOD       : kevent.key.code = KEY_PERIOD; break;
91        case SDLK_SLASH        : kevent.key.code = KEY_SLASH; break;
92        case SDLK_SEMICOLON    : kevent.key.code = KEY_SCOLON; break;
93        case SDLK_LEFTBRACKET  : kevent.key.code = KEY_LBRACKET; break;
94        case SDLK_BACKSLASH    : kevent.key.code = KEY_BSLASH; break;
95        case SDLK_RIGHTBRACKET : kevent.key.code = KEY_RBRACKET; break;
96        case SDLK_BACKQUOTE    : kevent.key.code = KEY_BQUOTE; break;
97        default : break;
98        }
99
100        // If key was understood by nv, then it's valid, otherwise ignored
101        return kevent.key.ascii != 0 || kevent.key.code != 0;
102}
103
104static bool sdl_mouse_button_to_io_event( const SDL_MouseButtonEvent& mb, io_event& mevent )
105{
106        mevent.type            = EV_MOUSE_BUTTON;
107        mevent.mbutton.button  = MOUSE_NONE;
108        mevent.mbutton.pressed = (mb.state != SDL_RELEASED);
109        mevent.mbutton.x       = static_cast< uint16 >( mb.x );
110        mevent.mbutton.y       = static_cast< uint16 >( mb.y );
111
112        switch ( mb.button )
113        {
114        case SDL_BUTTON_LEFT      : mevent.mbutton.button = MOUSE_LEFT; break;
115        case SDL_BUTTON_MIDDLE    : mevent.mbutton.button = MOUSE_MIDDLE; break;
116        case SDL_BUTTON_RIGHT     : mevent.mbutton.button = MOUSE_RIGHT; break;
117        default : break;
118        }
119
120        return mevent.mbutton.button != MOUSE_NONE;
121}
122
123static bool sdl_mouse_wheel_to_io_event( const SDL_MouseWheelEvent& mm, io_event& mevent )
124{
125        mevent.type          = EV_MOUSE_WHEEL;
126        mevent.mwheel.x      = static_cast< sint32 >( mm.x );
127        mevent.mwheel.y      = static_cast< sint32 >( mm.y );
128        return true;
129}
130
131static bool sdl_mouse_motion_to_io_event( const SDL_MouseMotionEvent& mm, io_event& mevent )
132{
133        mevent.type          = EV_MOUSE_MOVE;
134        mevent.mmove.pressed = (mm.state != SDL_RELEASED);
135        mevent.mmove.x       = static_cast< uint16 >( mm.x );
136        mevent.mmove.y       = static_cast< uint16 >( mm.y );
137        mevent.mmove.rx      = static_cast< sint16 >( mm.xrel );
138        mevent.mmove.ry      = static_cast< sint16 >( mm.yrel );
139        return true;
140}
141
142static bool sdl_joy_button_event_to_io_event( const SDL_JoyButtonEvent& jb, io_event& jevent )
143{
144        jevent.type            = EV_JOY_BUTTON;
145        jevent.jbutton.id      = jb.which;
146        jevent.jbutton.button  = jb.button;
147        jevent.jbutton.pressed = (jb.type == SDL_PRESSED);
148        return true;
149}
150
151static bool sdl_joy_axis_event_to_io_event( const SDL_JoyAxisEvent& ja, io_event& jevent )
152{
153        jevent.type          = EV_JOY_AXIS;
154        jevent.jaxis.id      = ja.which;
155        jevent.jaxis.axis    = ja.axis;
156        jevent.jaxis.value   = ja.value;
157        return true;
158}
159
160static bool sdl_joy_hat_event_to_io_event( const SDL_JoyHatEvent& jh, io_event& jevent )
161{
162        jevent.type          = EV_JOY_HAT;
163        jevent.jhat.id       = jh.which;
164        jevent.jhat.hat      = jh.hat;
165        jevent.jhat.value    = jh.value;
166        return true;
167}
168
169static bool sdl_joy_ball_event_to_io_event( const SDL_JoyBallEvent& jb, io_event& jevent )
170{
171        jevent.type          = EV_JOY_HAT;
172        jevent.jball.id      = jb.which;
173        jevent.jball.ball    = jb.ball;
174        jevent.jball.rx      = jb.xrel;
175        jevent.jball.ry      = jb.yrel;
176        return true;
177}
178
179static bool sdl_event_to_io_event( const SDL_Event& e, io_event& ioevent )
180{
181        switch ( e.type )
182        {
183        case SDL_KEYDOWN         : return sdl_key_event_to_io_event( e.key, ioevent );
184        case SDL_KEYUP           : return sdl_key_event_to_io_event( e.key, ioevent );
185        case SDL_MOUSEMOTION     : return sdl_mouse_motion_to_io_event( e.motion, ioevent );
186        case SDL_MOUSEBUTTONDOWN : return sdl_mouse_button_to_io_event( e.button, ioevent );
187        case SDL_MOUSEBUTTONUP   : return sdl_mouse_button_to_io_event( e.button, ioevent );
188        case SDL_MOUSEWHEEL      : return sdl_mouse_wheel_to_io_event( e.wheel, ioevent );
189/* // SDL 2.0 incompatible
190        case SDL_ACTIVEEVENT     :
191                ioevent.type = EV_ACTIVE;
192                ioevent.active.gain = (e.active.gain != 0);
193                return e.active.state == SDL_APPINPUTFOCUS;
194        case SDL_VIDEORESIZE     :
195                ioevent.type     = EV_RESIZE;
196                ioevent.resize.x = e.resize.w;
197                ioevent.resize.y = e.resize.h;
198                return true;
199        case SDL_NOEVENT         : return false;
200        case SDL_VIDEOEXPOSE     : return false;
201*/
202        case SDL_SYSWMEVENT      : ioevent.type = EV_SYSTEM; return true;
203        case SDL_QUIT            : ioevent.type = EV_QUIT;   return true;
204        case SDL_JOYAXISMOTION   : return sdl_joy_axis_event_to_io_event( e.jaxis, ioevent );
205        case SDL_JOYBALLMOTION   : return sdl_joy_ball_event_to_io_event( e.jball, ioevent );
206        case SDL_JOYHATMOTION    : return sdl_joy_hat_event_to_io_event( e.jhat, ioevent );
207        case SDL_JOYBUTTONDOWN   : return sdl_joy_button_event_to_io_event( e.jbutton, ioevent );
208        case SDL_JOYBUTTONUP     : return sdl_joy_button_event_to_io_event( e.jbutton, ioevent );
209        default : return false;
210        }
211}
212
213bool sdl::input::is_event_pending()
214{
215        return SDL_PollEvent( nullptr ) != 0;
216}
217
218bool sdl::input::poll_event( io_event& event )
219{
220        SDL_Event sdl_event;
221        if ( SDL_PollEvent( &sdl_event ) == 0 ) return false;
222        return sdl_event_to_io_event( sdl_event, event );
223}
224
Note: See TracBrowser for help on using the repository browser.