26int64_t axisMilli(int16_t raw) {
27 return static_cast<int64_t
>(std::lround(
clampAxis(raw / 32768.0f) * 1000.0f));
32 Message *translatePlatformEvent(
const void *nativeEvent)
override {
33 const auto &e = *
static_cast<const SDL_Event *
>(nativeEvent);
34 auto *joy = eve::ModuleManager::getInstance<Joystick>(
"Joystick");
35 if (!joy)
return nullptr;
38 case SDL_JOYDEVICEADDED: {
39 auto *pad = joy->addJoystick(e.jdevice.which);
40 if (!pad)
return nullptr;
41 return new Message(
"joystickadded",
42 {Variant::makeInt(pad->getID()),
43 Variant::makeString(pad->getName()),
44 Variant::makeInt(pad->isGamepad() ? 1 : 0)});
46 case SDL_JOYDEVICEREMOVED: {
47 auto *pad = joy->getJoystickFromID(e.jdevice.which);
48 if (!pad)
return nullptr;
49 const int id = pad->getID();
50 const std::string
name = pad->getName();
51 joy->removeJoystick(pad);
52 return new Message(
"joystickremoved",
53 {Variant::makeInt(
id), Variant::makeString(
name)});
55 case SDL_JOYBUTTONDOWN:
56 case SDL_JOYBUTTONUP: {
57 auto *pad = joy->getJoystickFromID(e.jbutton.which);
58 if (!pad)
return nullptr;
60 e.type == SDL_JOYBUTTONDOWN ?
"joystickpressed" :
"joystickreleased",
61 {Variant::makeInt(pad->getID()), Variant::makeInt(e.jbutton.button)});
63 case SDL_JOYAXISMOTION: {
64 auto *pad = joy->getJoystickFromID(e.jaxis.which);
65 if (!pad)
return nullptr;
66 return new Message(
"joystickaxis",
67 {Variant::makeInt(pad->getID()), Variant::makeInt(e.jaxis.axis),
68 Variant::makeInt(axisMilli(e.jaxis.value))});
70 case SDL_JOYHATMOTION: {
71 auto *pad = joy->getJoystickFromID(e.jhat.which);
72 if (!pad)
return nullptr;
73 return new Message(
"joystickhat",
74 {Variant::makeInt(pad->getID()), Variant::makeInt(e.jhat.hat),
75 Variant::makeString(pad->getHat(e.jhat.hat))});
77 case SDL_CONTROLLERBUTTONDOWN:
78 case SDL_CONTROLLERBUTTONUP: {
79 auto *pad = joy->getJoystickFromID(e.cbutton.which);
80 if (!pad)
return nullptr;
81 const char *btn = SDL_GameControllerGetStringForButton(
82 static_cast<SDL_GameControllerButton
>(e.cbutton.button));
84 e.type == SDL_CONTROLLERBUTTONDOWN ?
"gamepadpressed" :
"gamepadreleased",
85 {Variant::makeInt(pad->getID()), Variant::makeString(btn ? btn :
"")});
87 case SDL_CONTROLLERAXISMOTION: {
88 auto *pad = joy->getJoystickFromID(e.caxis.which);
89 if (!pad)
return nullptr;
90 const char *axis = SDL_GameControllerGetStringForAxis(
91 static_cast<SDL_GameControllerAxis
>(e.caxis.axis));
92 return new Message(
"gamepadaxis", {Variant::makeInt(pad->getID()),
93 Variant::makeString(axis ? axis :
""),
94 Variant::makeInt(axisMilli(e.caxis.value))});
104 static JoystickEventSink sink;