all repos — mgba @ f3ea4caf84ab2292e65b10245d9343b5ba31cdaf

mGBA Game Boy Advance Emulator

src/platform/sdl/sdl-events.h (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#ifndef SDL_EVENTS_H
  7#define SDL_EVENTS_H
  8
  9#include <mgba-util/common.h>
 10
 11CXX_GUARD_START
 12
 13#include <mgba/core/interface.h>
 14#include <mgba/core/log.h>
 15#include <mgba-util/circle-buffer.h>
 16#include <mgba-util/vector.h>
 17
 18#include <SDL.h>
 19// Altivec sometimes defines this
 20#ifdef vector
 21#undef vector
 22#endif
 23#ifdef bool
 24#undef bool
 25#define bool _Bool
 26#endif
 27
 28mLOG_DECLARE_CATEGORY(SDL_EVENTS);
 29
 30#define SDL_BINDING_KEY 0x53444C4BU
 31#define SDL_BINDING_BUTTON 0x53444C42U
 32
 33#define MAX_PLAYERS 4
 34
 35struct Configuration;
 36
 37struct SDL_JoystickCombo {
 38	size_t index;
 39	SDL_Joystick* joystick;
 40#if SDL_VERSION_ATLEAST(2, 0, 0)
 41	SDL_Haptic* haptic;
 42	SDL_JoystickID id;
 43#else
 44	int id;
 45#endif
 46};
 47
 48DECLARE_VECTOR(SDL_JoystickList, struct SDL_JoystickCombo);
 49
 50struct mSDLPlayer;
 51struct mSDLEvents {
 52	struct SDL_JoystickList joysticks;
 53	const char* preferredJoysticks[MAX_PLAYERS];
 54	int playersAttached;
 55	struct mSDLPlayer* players[MAX_PLAYERS];
 56#if SDL_VERSION_ATLEAST(2, 0, 0)
 57	int screensaverSuspendDepth;
 58	bool screensaverSuspendable;
 59#endif
 60};
 61
 62struct mSDLPlayer {
 63	size_t playerId;
 64	struct mInputMap* bindings;
 65	struct SDL_JoystickCombo* joystick;
 66#if SDL_VERSION_ATLEAST(2, 0, 0)
 67	SDL_Window* window;
 68	int fullscreen;
 69	int windowUpdated;
 70
 71	struct mSDLRumble {
 72		struct mRumble d;
 73		struct mSDLPlayer* p;
 74
 75		int level;
 76		float activeLevel;
 77		struct CircleBuffer history;
 78	} rumble;
 79#endif
 80
 81	struct mSDLRotation {
 82		struct mRotationSource d;
 83		struct mSDLPlayer* p;
 84
 85		// Tilt
 86		int axisX;
 87		int axisY;
 88
 89		// Gyro
 90		int gyroX;
 91		int gyroY;
 92		float gyroSensitivity;
 93		struct CircleBuffer zHistory;
 94		int oldX;
 95		int oldY;
 96		float zDelta;
 97	} rotation;
 98};
 99
100bool mSDLInitEvents(struct mSDLEvents*);
101void mSDLDeinitEvents(struct mSDLEvents*);
102
103bool mSDLAttachPlayer(struct mSDLEvents*, struct mSDLPlayer*);
104void mSDLDetachPlayer(struct mSDLEvents*, struct mSDLPlayer*);
105void mSDLEventsLoadConfig(struct mSDLEvents*, const struct Configuration*);
106void mSDLPlayerChangeJoystick(struct mSDLEvents*, struct mSDLPlayer*, size_t index);
107void mSDLUpdateJoysticks(struct mSDLEvents* events, const struct Configuration*);
108
109void mSDLPlayerLoadConfig(struct mSDLPlayer*, const struct Configuration*);
110void mSDLPlayerSaveConfig(const struct mSDLPlayer*, struct Configuration*);
111
112void mSDLInitBindingsGBA(struct mInputMap* inputMap);
113
114struct mCoreThread;
115void mSDLHandleEvent(struct mCoreThread* context, struct mSDLPlayer* sdlContext, const union SDL_Event* event);
116
117#if SDL_VERSION_ATLEAST(2, 0, 0)
118void mSDLSuspendScreensaver(struct mSDLEvents*);
119void mSDLResumeScreensaver(struct mSDLEvents*);
120void mSDLSetScreensaverSuspendable(struct mSDLEvents*, bool suspendable);
121#endif
122
123CXX_GUARD_END
124
125#endif