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

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

build: merge all static libraries into a single one.

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