Date:2014-02-23 17:00:12 (10 years 1 month ago)
Author:Paul Cercueil
Commit:7777b9edde60902d6d6f590eb827e723f1dd59fc
Message:Added key repeat on analog sticks and hats

Files: src/gmenu2x.cpp (2 diffs)
src/gmenu2x.h (1 diff)
src/inputmanager.cpp (5 diffs)
src/inputmanager.h (3 diffs)

Change Details

src/gmenu2x.cpp
257257    if (confInt["backlightTimeout"] > 0)
258258        PowerSaver::getInstance()->setScreenTimeout( confInt["backlightTimeout"] );
259259
260    setInputSpeed();
260    SDL_EnableKeyRepeat(INPUT_KEY_REPEAT_DELAY, INPUT_KEY_REPEAT_RATE);
261261#ifdef ENABLE_CPUFREQ
262262    setClock(confInt["menuClock"]);
263263#endif
...... 
10381038    unsigned short remocon;
10391039} MMSP2ADC;
10401040
1041void GMenu2X::setInputSpeed() {
1042    SDL_EnableKeyRepeat(250, 150);
1043}
1044
10451041#ifdef ENABLE_CPUFREQ
10461042void GMenu2X::setClock(unsigned mhz) {
10471043    mhz = constrain(mhz, cpuFreqMin, confInt["maxClock"]);
src/gmenu2x.h
182182    unsigned getDefaultAppClock() { return cpuFreqAppDefault; }
183183#endif
184184
185    void setInputSpeed();
186
187185    /**
188186     * Requests that the given application be launched.
189187     * The launch won't happen immediately; it will happen after control
src/inputmanager.cpp
5151    for (i = 0; i < SDL_NumJoysticks(); i++) {
5252        struct Joystick joystick = {
5353            SDL_JoystickOpen(i), false, false, false, false,
54            SDL_HAT_CENTERED, nullptr,
5455        };
5556        joysticks.push_back(joystick);
5657    }
...... 
151152            source = KEYBOARD;
152153            break;
153154#ifndef SDL_JOYSTICK_DISABLED
154        case SDL_JOYHATMOTION:
155            switch (event.jhat.value) {
156                case SDL_HAT_CENTERED:
157                    return false;
158                case SDL_HAT_UP:
159                    *button = UP;
160                    break;
161                case SDL_HAT_DOWN:
162                    *button = DOWN;
163                    break;
164                case SDL_HAT_LEFT:
165                    *button = LEFT;
166                    break;
167                case SDL_HAT_RIGHT:
168                    *button = RIGHT;
169                    break;
155        case SDL_JOYHATMOTION: {
156                Joystick *joystick = &joysticks[event.jaxis.which];
157                joystick->hatState = event.jhat.value;
158
159                switch (event.jhat.value) {
160                    case SDL_HAT_CENTERED:
161                        stopTimer(joystick);
162                        return false;
163                    case SDL_HAT_UP:
164                        *button = UP;
165                        break;
166                    case SDL_HAT_DOWN:
167                        *button = DOWN;
168                        break;
169                    case SDL_HAT_LEFT:
170                        *button = LEFT;
171                        break;
172                    case SDL_HAT_RIGHT:
173                        *button = RIGHT;
174                        break;
175                }
176                startTimer(joystick);
170177            }
171178        case SDL_JOYBUTTONDOWN:
172179            source = JOYSTICK;
...... 
179186                if (axis > 1)
180187                    return false;
181188
182                bool *axisState = joysticks[event.jaxis.which].axisState[axis];
189                Joystick *joystick = &joysticks[event.jaxis.which];
190                bool *axisState = joystick->axisState[axis];
183191
184192                if (event.jaxis.value < -20000) {
185193                    if (axisState[AXIS_STATE_NEGATIVE])
...... 
194202                    axisState[AXIS_STATE_POSITIVE] = true;
195203                    *button = axis ? DOWN : RIGHT;
196204                } else {
205                    bool *otherAxisState = joystick->axisState[!axis];
206                    if (!otherAxisState[AXIS_STATE_NEGATIVE] &&
207                                !otherAxisState[AXIS_STATE_POSITIVE] && (
208                                    axisState[AXIS_STATE_NEGATIVE] ||
209                                    axisState[AXIS_STATE_POSITIVE]))
210                        stopTimer(joystick);
211
197212                    axisState[0] = axisState[1] = false;
198213                    return false;
199214                }
215                startTimer(joystick);
200216                break;
201217            }
202218#endif
...... 
259275
260276    return true;
261277}
278
279Uint32 keyRepeatCallback(Uint32 timeout __attribute__((unused)), void *d)
280{
281    struct Joystick *joystick = (struct Joystick *) d;
282    Uint8 hatState = joystick->hatState;
283
284    if (joystick->axisState[1][AXIS_STATE_NEGATIVE])
285        hatState |= SDL_HAT_UP;
286    else if (joystick->axisState[1][AXIS_STATE_POSITIVE])
287        hatState |= SDL_HAT_DOWN;
288    if (joystick->axisState[0][AXIS_STATE_NEGATIVE])
289        hatState |= SDL_HAT_LEFT;
290    else if (joystick->axisState[0][AXIS_STATE_POSITIVE])
291        hatState |= SDL_HAT_RIGHT;
292
293    SDL_JoyHatEvent e = {
294        .type = SDL_JOYHATMOTION,
295        .which = (Uint8) SDL_JoystickIndex(joystick->joystick),
296        .hat = 0,
297        .value = hatState,
298    };
299    SDL_PushEvent((SDL_Event *) &e);
300
301    return INPUT_KEY_REPEAT_RATE;
302}
303
304void InputManager::startTimer(Joystick *joystick)
305{
306    if (joystick->timer)
307        return;
308
309    joystick->timer = SDL_AddTimer(INPUT_KEY_REPEAT_DELAY,
310                keyRepeatCallback, joystick);
311}
312
313void InputManager::stopTimer(Joystick *joystick)
314{
315    if (joystick->timer) {
316        SDL_RemoveTimer(joystick->timer);
317        joystick->timer = nullptr;
318    }
319}
src/inputmanager.h
2525#include <string>
2626#include <vector>
2727
28#define INPUT_KEY_REPEAT_DELAY 250
29#define INPUT_KEY_REPEAT_RATE 150
30
2831class Menu;
2932
3033enum EventCode {
...... 
3437    REPAINT_MENU,
3538};
3639
40#ifndef SDL_JOYSTICK_DISABLED
41#define AXIS_STATE_POSITIVE 0
42#define AXIS_STATE_NEGATIVE 1
43struct Joystick {
44    SDL_Joystick *joystick;
45    bool axisState[2][2];
46    Uint8 hatState;
47    SDL_TimerID timer;
48};
49#endif
50
3751class InputManager {
3852public:
3953    enum Button {
...... 
6680
6781    ButtonMapEntry buttonMap[BUTTON_TYPE_SIZE];
6882#ifndef SDL_JOYSTICK_DISABLED
69#define AXIS_STATE_POSITIVE 0
70#define AXIS_STATE_NEGATIVE 1
71    struct Joystick {
72        SDL_Joystick *joystick;
73        bool axisState[2][2];
74    };
75
7683    std::vector<Joystick> joysticks;
84
85    void startTimer(Joystick *joystick);
86    void stopTimer(Joystick *joystick);
7787#endif
7888};
7989

Archive Download the corresponding diff file



interactive