all repos — mgba @ f6a7fedb2813d070a07cd6da65e8ddd666cd41d1

mGBA Game Boy Advance Emulator

src/platform/qt/InputController.cpp (view raw)

  1/* Copyright (c) 2013-2014 Jeffrey Pfau
  2 *
  3 * This Source Code Form is subject to the terms of the Mozilla Public
  4 * License, v. 2.0. If a copy of the MPL was not distributed with this
  5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  6#include "InputController.h"
  7
  8#include "ConfigController.h"
  9
 10extern "C" {
 11#include "util/configuration.h"
 12}
 13
 14using namespace QGBA;
 15
 16InputController::InputController() {
 17	GBAInputMapInit(&m_inputMap);
 18
 19#ifdef BUILD_SDL
 20	m_sdlEvents.bindings = &m_inputMap;
 21	GBASDLInitEvents(&m_sdlEvents);
 22	GBASDLInitBindings(&m_inputMap);
 23	SDL_JoystickEventState(SDL_QUERY);
 24#endif
 25
 26	GBAInputBindKey(&m_inputMap, KEYBOARD, Qt::Key_X, GBA_KEY_A);
 27	GBAInputBindKey(&m_inputMap, KEYBOARD, Qt::Key_Z, GBA_KEY_B);
 28	GBAInputBindKey(&m_inputMap, KEYBOARD, Qt::Key_A, GBA_KEY_L);
 29	GBAInputBindKey(&m_inputMap, KEYBOARD, Qt::Key_S, GBA_KEY_R);
 30	GBAInputBindKey(&m_inputMap, KEYBOARD, Qt::Key_Return, GBA_KEY_START);
 31	GBAInputBindKey(&m_inputMap, KEYBOARD, Qt::Key_Backspace, GBA_KEY_SELECT);
 32	GBAInputBindKey(&m_inputMap, KEYBOARD, Qt::Key_Up, GBA_KEY_UP);
 33	GBAInputBindKey(&m_inputMap, KEYBOARD, Qt::Key_Down, GBA_KEY_DOWN);
 34	GBAInputBindKey(&m_inputMap, KEYBOARD, Qt::Key_Left, GBA_KEY_LEFT);
 35	GBAInputBindKey(&m_inputMap, KEYBOARD, Qt::Key_Right, GBA_KEY_RIGHT);
 36}
 37
 38InputController::~InputController() {
 39	GBAInputMapDeinit(&m_inputMap);
 40
 41#ifdef BUILD_SDL
 42	GBASDLDeinitEvents(&m_sdlEvents);
 43#endif
 44}
 45
 46void InputController::setConfiguration(ConfigController* config) {
 47	m_config = config;
 48	loadConfiguration(KEYBOARD);
 49#ifdef BUILD_SDL
 50	loadConfiguration(SDL_BINDING_BUTTON);
 51#endif
 52}
 53
 54void InputController::loadConfiguration(uint32_t type) {
 55	GBAInputMapLoad(&m_inputMap, type, m_config->configuration());
 56}
 57
 58void InputController::saveConfiguration(uint32_t type) {
 59	GBAInputMapSave(&m_inputMap, type, m_config->configuration());
 60	m_config->write();
 61}
 62
 63GBAKey InputController::mapKeyboard(int key) const {
 64	return GBAInputMapKey(&m_inputMap, KEYBOARD, key);
 65}
 66
 67void InputController::bindKey(uint32_t type, int key, GBAKey gbaKey) {
 68	return GBAInputBindKey(&m_inputMap, type, key, gbaKey);
 69}
 70
 71#ifdef BUILD_SDL
 72int InputController::testSDLEvents() {
 73	SDL_Joystick* joystick = m_sdlEvents.joystick;
 74	SDL_JoystickUpdate();
 75	int numButtons = SDL_JoystickNumButtons(joystick);
 76	int activeButtons = 0;
 77	int i;
 78	for (i = 0; i < numButtons; ++i) {
 79		GBAKey key = GBAInputMapKey(&m_inputMap, SDL_BINDING_BUTTON, i);
 80		if (key == GBA_KEY_NONE) {
 81			continue;
 82		}
 83		if (SDL_JoystickGetButton(joystick, i)) {
 84			activeButtons |= 1 << key;
 85		}
 86	}
 87	int numHats = SDL_JoystickNumHats(joystick);
 88	for (i = 0; i < numHats; ++i) {
 89		int hat = SDL_JoystickGetHat(joystick, i);
 90		if (hat & SDL_HAT_UP) {
 91			activeButtons |= 1 << GBA_KEY_UP;
 92		}
 93		if (hat & SDL_HAT_LEFT) {
 94			activeButtons |= 1 << GBA_KEY_LEFT;
 95		}
 96		if (hat & SDL_HAT_DOWN) {
 97			activeButtons |= 1 << GBA_KEY_DOWN;
 98		}
 99		if (hat & SDL_HAT_RIGHT) {
100			activeButtons |= 1 << GBA_KEY_RIGHT;
101		}
102	}
103	return activeButtons;
104}
105
106QSet<int> InputController::activeGamepadButtons() {
107	SDL_Joystick* joystick = m_sdlEvents.joystick;
108	SDL_JoystickUpdate();
109	int numButtons = SDL_JoystickNumButtons(joystick);
110	QSet<int> activeButtons;
111	int i;
112	for (i = 0; i < numButtons; ++i) {
113		if (SDL_JoystickGetButton(joystick, i)) {
114			activeButtons.insert(i);
115		}
116	}
117	return activeButtons;
118}
119#endif