src/platform/qt/InputController.h (view raw)
1/* Copyright (c) 2013-2015 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 QGBA_INPUT_CONTROLLER_H
7#define QGBA_INPUT_CONTROLLER_H
8
9#include "GamepadAxisEvent.h"
10
11#include <QObject>
12#include <QSet>
13#include <QVector>
14
15class QTimer;
16
17extern "C" {
18#include "gba/input.h"
19
20#ifdef BUILD_SDL
21#include "platform/sdl/sdl-events.h"
22#endif
23}
24
25namespace QGBA {
26
27class ConfigController;
28
29class InputController : public QObject {
30Q_OBJECT
31
32public:
33 static const uint32_t KEYBOARD = 0x51545F4B;
34
35 InputController(int playerId = 0, QWidget* topLevel = nullptr, QObject* parent = nullptr);
36 ~InputController();
37
38 void setConfiguration(ConfigController* config);
39 void saveConfiguration();
40 void loadConfiguration(uint32_t type);
41 void loadProfile(uint32_t type, const QString& profile);
42 void saveConfiguration(uint32_t type);
43 void saveProfile(uint32_t type, const QString& profile);
44 const char* profileForType(uint32_t type);
45
46 bool allowOpposing() const { return m_allowOpposing; }
47 void setAllowOpposing(bool allowOpposing) { m_allowOpposing = allowOpposing; }
48
49 GBAKey mapKeyboard(int key) const;
50
51 void bindKey(uint32_t type, int key, GBAKey);
52
53 const GBAInputMap* map() const { return &m_inputMap; }
54
55 void updateJoysticks();
56 int pollEvents();
57
58 static const int32_t AXIS_THRESHOLD = 0x3000;
59 QSet<int> activeGamepadButtons(int type);
60 QSet<QPair<int, GamepadAxisEvent::Direction>> activeGamepadAxes(int type);
61 void recalibrateAxes();
62
63 void bindAxis(uint32_t type, int axis, GamepadAxisEvent::Direction, GBAKey);
64 void unbindAllAxes(uint32_t type);
65
66 QStringList connectedGamepads(uint32_t type) const;
67 int gamepad(uint32_t type) const;
68 void setGamepad(uint32_t type, int index);
69 void setPreferredGamepad(uint32_t type, const QString& device);
70
71 void registerTiltAxisX(int axis);
72 void registerTiltAxisY(int axis);
73 void registerGyroAxisX(int axis);
74 void registerGyroAxisY(int axis);
75
76 float gyroSensitivity() const;
77 void setGyroSensitivity(float sensitivity);
78
79 void stealFocus(QWidget* focus);
80 void releaseFocus(QWidget* focus);
81
82 GBARumble* rumble();
83 GBARotationSource* rotationSource();
84
85signals:
86 void profileLoaded(const QString& profile);
87
88public slots:
89 void testGamepad(int type);
90
91 // TODO: Move these to somewhere that makes sense
92 void suspendScreensaver();
93 void resumeScreensaver();
94 void setScreensaverSuspendable(bool);
95
96private:
97 void postPendingEvent(GBAKey);
98 void clearPendingEvent(GBAKey);
99 bool hasPendingEvent(GBAKey) const;
100 void sendGamepadEvent(QEvent*);
101
102 GBAInputMap m_inputMap;
103 ConfigController* m_config;
104 int m_playerId;
105 bool m_allowOpposing;
106 QWidget* m_topLevel;
107 QWidget* m_focusParent;
108
109#ifdef BUILD_SDL
110 static int s_sdlInited;
111 static GBASDLEvents s_sdlEvents;
112 GBASDLPlayer m_sdlPlayer;
113 bool m_playerAttached;
114#endif
115
116 QVector<int> m_deadzones;
117
118 QSet<int> m_activeButtons;
119 QSet<QPair<int, GamepadAxisEvent::Direction>> m_activeAxes;
120 QTimer* m_gamepadTimer;
121
122 QSet<GBAKey> m_pendingEvents;
123};
124
125}
126
127#endif