// AK
void get_key_bindings()
{
    if( key_map )
    {
        free( key_map );
    }
    key_map = NULL;

    key_players = 1;
    key_map = (player_keys *)malloc( sizeof( player_keys ) * key_players );
    for( int i = 0; i < key_players; i++ )
    {
        key_map[i].joy = 0;
        key_map[i].left = get_key_binding( "left", i + 1 );
        key_map[i].right = get_key_binding( "right", i + 1 );
        key_map[i].up = get_key_binding( "up", i + 1 );
        key_map[i].down = get_key_binding( "down", i + 1 );
        key_map[i].b4 = get_key_binding( "b4", i + 1 );
        key_map[i].b3 = get_key_binding( "b3", i + 1 );
        key_map[i].b2 = get_key_binding( "b2", i + 1 );
        key_map[i].b1 = get_key_binding( "b1", i + 1 );
    }
}
Exemple #2
0
//
// get_event()
// Get and handle waiting events
//
void event_handler::get_event(event &ev) {
	event *ep;
	while (!ewaiting) {
		event_waiting();

		if (!ewaiting) {
			// Sleep for 1 millisecond if there are no events
			Timer tmp;
			tmp.WaitMs(1);
		}
	}

	ep = (event *) events.first();
	if (ep) {
		ev = *ep;
		events.unlink(ep);
		delete ep;
		ewaiting = events.first() != NULL;
	} else {
		// NOTE : that the mouse status should be known
		// even if another event has occurred.
		ev.mouse_move.x = mouse->x();
		ev.mouse_move.y = mouse->y();
		ev.mouse_button = mouse->button();

		// Gather events
		SDL_Event event;
		if (SDL_PollEvent(&event)) {
			// always sort the mouse out
			handle_mouse(ev);
			mouse->update(ev.mouse_move.x, ev.mouse_move.y, ev.mouse_button);

			switch (event.type) {
			case SDL_QUIT: {
				exit(0);
				break;
			}
			case SDL_MOUSEBUTTONUP: {
				switch (event.button.button) {
				case 4: // Mouse wheel goes up...
				{
					ev.key = get_key_binding("b4", 0);
					ev.type = EV_KEYRELEASE;
					break;
				}
				case 5: // Mouse wheel goes down...
				{
					ev.key = get_key_binding("b3", 0);
					ev.type = EV_KEYRELEASE;
					break;
				}
				}
				break;
			}
			case SDL_MOUSEBUTTONDOWN: {
				switch (event.button.button) {
				case 4: // Mouse wheel goes up...
				{
					ev.key = get_key_binding("b4", 0);
					ev.type = EV_KEY;
					break;
				}
				case 5: // Mouse wheel goes down...
				{
					ev.key = get_key_binding("b3", 0);
					ev.type = EV_KEY;
					break;
				}
				}
				break;
			}
			case SDL_KEYDOWN:
			case SDL_KEYUP: {
				// Default to EV_SPURIOUS
				ev.key = EV_SPURIOUS;
				if (event.type == SDL_KEYDOWN) {
					ev.type = EV_KEY;
				} else {
					ev.type = EV_KEYRELEASE;
				}
				switch (event.key.keysym.sym) {
				case SDLK_DOWN:
					ev.key = JK_DOWN;
					break;
				case SDLK_UP:
					ev.key = JK_UP;
					break;
				case SDLK_LEFT:
					ev.key = JK_LEFT;
					break;
				case SDLK_RIGHT:
					ev.key = JK_RIGHT;
					break;
				case SDLK_LCTRL:
					ev.key = JK_CTRL_L;
					break;
				case SDLK_RCTRL:
					ev.key = JK_CTRL_R;
					break;
				case SDLK_LALT:
					ev.key = JK_ALT_L;
					break;
				case SDLK_RALT:
					ev.key = JK_ALT_R;
					break;
				case SDLK_LSHIFT:
					ev.key = JK_SHIFT_L;
					break;
				case SDLK_RSHIFT:
					ev.key = JK_SHIFT_R;
					break;
				case SDLK_NUMLOCK:
					ev.key = JK_NUM_LOCK;
					break;
				case SDLK_HOME:
					ev.key = JK_HOME;
					break;
				case SDLK_END:
					ev.key = JK_END;
					break;
				case SDLK_BACKSPACE:
					ev.key = JK_BACKSPACE;
					break;
				case SDLK_TAB:
					ev.key = JK_TAB;
					break;
				case SDLK_RETURN:
					ev.key = JK_ENTER;
					break;
				case SDLK_SPACE:
					ev.key = JK_SPACE;
					break;
				case SDLK_CAPSLOCK:
					ev.key = JK_CAPS;
					break;
				case SDLK_ESCAPE:
					ev.key = JK_ESC;
					break;
				case SDLK_F1:
					ev.key = JK_F1;
					break;
				case SDLK_F2:
					ev.key = JK_F2;
					break;
				case SDLK_F3:
					ev.key = JK_F3;
					break;
				case SDLK_F4:
					ev.key = JK_F4;
					break;
				case SDLK_F5:
					ev.key = JK_F5;
					break;
				case SDLK_F6:
					ev.key = JK_F6;
					break;
				case SDLK_F7:
					ev.key = JK_F7;
					break;
				case SDLK_F8:
					ev.key = JK_F8;
					break;
				case SDLK_F9:
					ev.key = JK_F9;
					break;
				case SDLK_F10:
					ev.key = JK_F10;
					break;
				case SDLK_INSERT:
					ev.key = JK_INSERT;
					break;
				case SDLK_KP0:
					ev.key = JK_INSERT;
					break;
				case SDLK_PAGEUP:
					ev.key = JK_PAGEUP;
					break;
				case SDLK_PAGEDOWN:
					ev.key = JK_PAGEDOWN;
					break;
				case SDLK_KP8:
					ev.key = JK_UP;
					break;
				case SDLK_KP2:
					ev.key = JK_DOWN;
					break;
				case SDLK_KP4:
					ev.key = JK_LEFT;
					break;
				case SDLK_KP6:
					ev.key = JK_RIGHT;
					break;
				case SDLK_F11: {
					// Only handle key down
					if (ev.type == EV_KEY) {
						// Toggle fullscreen
						SDL_WM_ToggleFullScreen(SDL_GetVideoSurface());
					}
					ev.key = EV_SPURIOUS;
					break;
				}
				case SDLK_F12: {
					// Only handle key down
					if (ev.type == EV_KEY) {
						// Toggle grab mouse
						if (SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_ON) {
							the_game->show_help("Grab Mouse: OFF\n");
							SDL_WM_GrabInput (SDL_GRAB_OFF);
						} else {
							the_game->show_help("Grab Mouse: ON\n");
							SDL_WM_GrabInput (SDL_GRAB_ON);
						}
					}
					ev.key = EV_SPURIOUS;
					break;
				}
				case SDLK_PRINT: // print-screen key
				{
					// Only handle key down
					if (ev.type == EV_KEY) {
						// Grab a screenshot
						SDL_SaveBMP(SDL_GetVideoSurface(), "screenshot.bmp");
						the_game->show_help(
								"Screenshot saved to: screenshot.bmp.\n");
					}
					ev.key = EV_SPURIOUS;
					break;
				}
				default: {
					ev.key = (int) event.key.keysym.sym;
					// Need to handle the case of shift being pressed
					// There has to be a better way
					if ((event.key.keysym.mod & KMOD_SHIFT) != 0) {
						if (event.key.keysym.sym >= SDLK_a
								&& event.key.keysym.sym <= SDLK_z) {
							ev.key -= 32;
						} else if (event.key.keysym.sym >= SDLK_1
								&& event.key.keysym.sym <= SDLK_5) {
							ev.key -= 16;
						} else {
							switch (event.key.keysym.sym) {
							case SDLK_6:
								ev.key = SDLK_CARET;
								break;
							case SDLK_7:
							case SDLK_9:
							case SDLK_0:
								ev.key -= 17;
								break;
							case SDLK_8:
								ev.key = SDLK_ASTERISK;
								break;
							case SDLK_MINUS:
								ev.key = SDLK_UNDERSCORE;
								break;
							case SDLK_EQUALS:
								ev.key = SDLK_PLUS;
								break;
							case SDLK_COMMA:
								ev.key = SDLK_LESS;
								break;
							case SDLK_PERIOD:
								ev.key = SDLK_GREATER;
								break;
							case SDLK_SLASH:
								ev.key = SDLK_QUESTION;
								break;
							case SDLK_SEMICOLON:
								ev.key = SDLK_COLON;
								break;
							case SDLK_QUOTE:
								ev.key = SDLK_QUOTEDBL;
								break;
							default:
								break;
							}
						}
					}
				}
				}
				break;
			}
			}
		}
		// No more events
		ewaiting = 0;
	}
}