source: abuse/branches/lol/src/sdlport/event.cpp @ 732

Last change on this file since 732 was 732, checked in by Sam Hocevar, 9 years ago

build: SDL2 compilation fixes.

File size: 10.2 KB
Line 
1/*
2 *  Abuse - dark 2D side-scrolling platform game
3 *  Copyright (c) 2001 Anthony Kruize <trandor@labyrinth.net.au>
4 *  Copyright (c) 2005-2013 Sam Hocevar <sam@hocevar.net>
5 *
6 *  This program is free software; you can redistribute it and/or modify
7 *  it under the terms of the GNU General Public License as published by
8 *  the Free Software Foundation; either version 2 of the License, or
9 *  (at your option) any later version.
10 *
11 *  This program is distributed in the hope that it will be useful,
12 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 *  GNU General Public License for more details.
15 *
16 *  You should have received a copy of the GNU General Public License
17 *  along with this program; if not, write to the Free Software Foundation,
18 *  Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
19 */
20
21#if HAVE_CONFIG_H
22#   include "config.h"
23#endif
24
25#if defined HAVE_SDL_SDL_H
26#   include <SDL/SDL.h>
27#else
28#   include <SDL.h>
29#endif
30
31#include "common.h"
32
33#include "imlib/image.h"
34#include "imlib/palette.h"
35#include "imlib/video.h"
36#include "imlib/event.h"
37
38#include "sprite.h"
39#include "game.h"
40
41extern int get_key_binding(char const *dir, int i);
42short mouse_buttons[5] = { 0, 0, 0, 0, 0 };
43
44void EventHandler::SysWarpMouse(ivec2 pos)
45{
46#if SDL_VERSION_ATLEAST(2,0,0)
47#   warning no SDL_WarpMouse in SDL2
48#else
49    SDL_WarpMouse(pos.x, pos.y);
50#endif
51}
52
53//
54// IsPending()
55// Are there any events in the queue?
56//
57int EventHandler::IsPending()
58{
59    if (!m_pending && SDL_PollEvent(NULL))
60        m_pending = 1;
61
62    return m_pending;
63}
64
65//
66// Get and handle waiting events
67//
68void EventHandler::SysEvent(Event &ev)
69{
70    // No more events
71    m_pending = 0;
72
73    // NOTE : that the mouse status should be known
74    // even if another event has occurred.
75    ev.mouse_move.x = m_pos.x;
76    ev.mouse_move.y = m_pos.y;
77    ev.mouse_button = m_button;
78
79    // Gather next event
80    SDL_Event sdlev;
81    if (!SDL_PollEvent(&sdlev))
82        return; // This should not happen
83
84    // Sort the mouse out
85    int x, y;
86    uint8_t buttons = SDL_GetMouseState(&x, &y);
87    /* FIXME: this should be somewhere else */
88    x = x * main_screen->Size().x / Video::GetSize().x;
89    y = y * main_screen->Size().y / Video::GetSize().y;
90    ev.mouse_move.x = lol::min(x, main_screen->Size().x - 1);
91    ev.mouse_move.y = lol::min(y, main_screen->Size().y - 1);
92    ev.type = EV_MOUSE_MOVE;
93
94    // Left button
95    if((buttons & SDL_BUTTON(1)) && !mouse_buttons[1])
96    {
97        ev.type = EV_MOUSE_BUTTON;
98        mouse_buttons[1] = !mouse_buttons[1];
99        ev.mouse_button |= LEFT_BUTTON;
100    }
101    else if(!(buttons & SDL_BUTTON(1)) && mouse_buttons[1])
102    {
103        ev.type = EV_MOUSE_BUTTON;
104        mouse_buttons[1] = !mouse_buttons[1];
105        ev.mouse_button &= (0xff - LEFT_BUTTON);
106    }
107
108    // Middle button
109    if((buttons & SDL_BUTTON(2)) && !mouse_buttons[2])
110    {
111        ev.type = EV_MOUSE_BUTTON;
112        mouse_buttons[2] = !mouse_buttons[2];
113        ev.mouse_button |= LEFT_BUTTON;
114        ev.mouse_button |= RIGHT_BUTTON;
115    }
116    else if(!(buttons & SDL_BUTTON(2)) && mouse_buttons[2])
117    {
118        ev.type = EV_MOUSE_BUTTON;
119        mouse_buttons[2] = !mouse_buttons[2];
120        ev.mouse_button &= (0xff - LEFT_BUTTON);
121        ev.mouse_button &= (0xff - RIGHT_BUTTON);
122    }
123
124    // Right button
125    if((buttons & SDL_BUTTON(3)) && !mouse_buttons[3])
126    {
127        ev.type = EV_MOUSE_BUTTON;
128        mouse_buttons[3] = !mouse_buttons[3];
129        ev.mouse_button |= RIGHT_BUTTON;
130    }
131    else if(!(buttons & SDL_BUTTON(3)) && mouse_buttons[3])
132    {
133        ev.type = EV_MOUSE_BUTTON;
134        mouse_buttons[3] = !mouse_buttons[3];
135        ev.mouse_button &= (0xff - RIGHT_BUTTON);
136    }
137    m_pos = ivec2(ev.mouse_move.x, ev.mouse_move.y);
138    m_button = ev.mouse_button;
139
140    // Sort out other kinds of events
141    switch(sdlev.type)
142    {
143    case SDL_QUIT:
144        exit(0);
145        break;
146    case SDL_MOUSEBUTTONUP:
147        switch(sdlev.button.button)
148        {
149        case 4:        // Mouse wheel goes up...
150            ev.key = get_key_binding("b4", 0);
151            ev.type = EV_KEYRELEASE;
152            break;
153        case 5:        // Mouse wheel goes down...
154            ev.key = get_key_binding("b3", 0);
155            ev.type = EV_KEYRELEASE;
156            break;
157        }
158        break;
159    case SDL_MOUSEBUTTONDOWN:
160        switch(sdlev.button.button)
161        {
162        case 4:        // Mouse wheel goes up...
163            ev.key = get_key_binding("b4", 0);
164            ev.type = EV_KEY;
165            break;
166        case 5:        // Mouse wheel goes down...
167            ev.key = get_key_binding("b3", 0);
168            ev.type = EV_KEY;
169            break;
170        }
171        break;
172    case SDL_KEYDOWN:
173    case SDL_KEYUP:
174        // Default to EV_SPURIOUS
175        ev.key = EV_SPURIOUS;
176        if(sdlev.type == SDL_KEYDOWN)
177        {
178            ev.type = EV_KEY;
179        }
180        else
181        {
182            ev.type = EV_KEYRELEASE;
183        }
184        switch(sdlev.key.keysym.sym)
185        {
186        case SDLK_DOWN:         ev.key = JK_DOWN; break;
187        case SDLK_UP:           ev.key = JK_UP; break;
188        case SDLK_LEFT:         ev.key = JK_LEFT; break;
189        case SDLK_RIGHT:        ev.key = JK_RIGHT; break;
190        case SDLK_LCTRL:        ev.key = JK_CTRL_L; break;
191        case SDLK_RCTRL:        ev.key = JK_CTRL_R; break;
192        case SDLK_LALT:         ev.key = JK_ALT_L; break;
193        case SDLK_RALT:         ev.key = JK_ALT_R; break;
194        case SDLK_LSHIFT:       ev.key = JK_SHIFT_L; break;
195        case SDLK_RSHIFT:       ev.key = JK_SHIFT_R; break;
196#if SDL_VERSION_ATLEAST(2,0,0)
197#   warning no event keys in SDL2
198#else
199        case SDLK_NUMLOCK:      ev.key = JK_NUM_LOCK; break;
200        case SDLK_HOME:         ev.key = JK_HOME; break;
201        case SDLK_END:          ev.key = JK_END; break;
202        case SDLK_BACKSPACE:    ev.key = JK_BACKSPACE; break;
203        case SDLK_TAB:          ev.key = JK_TAB; break;
204        case SDLK_RETURN:       ev.key = JK_ENTER; break;
205        case SDLK_SPACE:        ev.key = JK_SPACE; break;
206        case SDLK_CAPSLOCK:     ev.key = JK_CAPS; break;
207        case SDLK_ESCAPE:       ev.key = JK_ESC; break;
208        case SDLK_F1:           ev.key = JK_F1; break;
209        case SDLK_F2:           ev.key = JK_F2; break;
210        case SDLK_F3:           ev.key = JK_F3; break;
211        case SDLK_F4:           ev.key = JK_F4; break;
212        case SDLK_F5:           ev.key = JK_F5; break;
213        case SDLK_F6:           ev.key = JK_F6; break;
214        case SDLK_F7:           ev.key = JK_F7; break;
215        case SDLK_F8:           ev.key = JK_F8; break;
216        case SDLK_F9:           ev.key = JK_F9; break;
217        case SDLK_F10:          ev.key = JK_F10; break;
218        case SDLK_INSERT:       ev.key = JK_INSERT; break;
219        case SDLK_KP0:          ev.key = JK_INSERT; break;
220        case SDLK_PAGEUP:       ev.key = JK_PAGEUP; break;
221        case SDLK_PAGEDOWN:     ev.key = JK_PAGEDOWN; break;
222        case SDLK_KP8:          ev.key = JK_UP; break;
223        case SDLK_KP2:          ev.key = JK_DOWN; break;
224        case SDLK_KP4:          ev.key = JK_LEFT; break;
225        case SDLK_KP6:          ev.key = JK_RIGHT; break;
226        case SDLK_F11:
227            // Only handle key down
228            if(ev.type == EV_KEY)
229            {
230                // Toggle fullscreen
231                SDL_WM_ToggleFullScreen(SDL_GetVideoSurface());
232            }
233            ev.key = EV_SPURIOUS;
234            break;
235        case SDLK_F12:
236            // Only handle key down
237            if(ev.type == EV_KEY)
238            {
239                // Toggle grab mouse
240                if(SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_ON)
241                {
242                    the_game->show_help("Grab Mouse: OFF\n");
243                    SDL_WM_GrabInput(SDL_GRAB_OFF);
244                }
245                else
246                {
247                    the_game->show_help("Grab Mouse: ON\n");
248                    SDL_WM_GrabInput(SDL_GRAB_ON);
249                }
250            }
251            ev.key = EV_SPURIOUS;
252            break;
253        case SDLK_PRINT:    // print-screen key
254            // Only handle key down
255            if(ev.type == EV_KEY)
256            {
257                // Grab a screenshot
258                SDL_SaveBMP(SDL_GetVideoSurface(), "screenshot.bmp");
259                the_game->show_help("Screenshot saved to: screenshot.bmp.\n");
260            }
261            ev.key = EV_SPURIOUS;
262            break;
263#endif
264        default:
265            ev.key = (int)sdlev.key.keysym.sym;
266            // Need to handle the case of shift being pressed
267            // There has to be a better way
268            if((sdlev.key.keysym.mod & KMOD_SHIFT) != 0)
269            {
270                if(sdlev.key.keysym.sym >= SDLK_a &&
271                    sdlev.key.keysym.sym <= SDLK_z)
272                {
273                    ev.key -= 32;
274                }
275                else if(sdlev.key.keysym.sym >= SDLK_1 &&
276                         sdlev.key.keysym.sym <= SDLK_5)
277                {
278                    ev.key -= 16;
279                }
280                else
281                {
282                    switch(sdlev.key.keysym.sym)
283                    {
284                    case SDLK_6:
285                        ev.key = SDLK_CARET; break;
286                    case SDLK_7:
287                    case SDLK_9:
288                    case SDLK_0:
289                        ev.key -= 17; break;
290                    case SDLK_8:
291                        ev.key = SDLK_ASTERISK; break;
292                    case SDLK_MINUS:
293                        ev.key = SDLK_UNDERSCORE; break;
294                    case SDLK_EQUALS:
295                        ev.key = SDLK_PLUS; break;
296                    case SDLK_COMMA:
297                        ev.key = SDLK_LESS; break;
298                    case SDLK_PERIOD:
299                        ev.key = SDLK_GREATER; break;
300                    case SDLK_SLASH:
301                        ev.key = SDLK_QUESTION; break;
302                    case SDLK_SEMICOLON:
303                        ev.key = SDLK_COLON; break;
304                    case SDLK_QUOTE:
305                        ev.key = SDLK_QUOTEDBL; break;
306                    default:
307                        break;
308                    }
309                }
310            }
311            break;
312        }
313    }
314}
315
Note: See TracBrowser for help on using the repository browser.