30int64_t axisMilli(int16_t raw) {
31 return static_cast<int64_t
>(std::lround(
clampAxis(raw / 32768.0f) * 1000.0f));
36 Message *translatePlatformEvent(
const void *nativeEvent)
override {
37 const auto &e = *
static_cast<const SDL_Event *
>(nativeEvent);
39 if (!joy)
return nullptr;
42 case SDL_JOYDEVICEADDED: {
44 if (!
pad)
return nullptr;
45 return new Message(
"joystickadded",
46 {Variant::makeInt(
pad->getID()),
47 Variant::makeString(
pad->getName()),
48 Variant::makeInt(
pad->isGamepad() ? 1 : 0)});
50 case SDL_JOYDEVICEREMOVED: {
51 auto *
pad = joy->getJoystickFromID(e.jdevice.which);
52 if (!
pad)
return nullptr;
53 const int id =
pad->getID();
54 const std::string
name =
pad->getName();
55 joy->removeJoystick(
pad);
56 return new Message(
"joystickremoved",
57 {Variant::makeInt(
id), Variant::makeString(
name)});
59 case SDL_JOYBUTTONDOWN:
60 case SDL_JOYBUTTONUP: {
61 auto *
pad = joy->getJoystickFromID(e.jbutton.which);
62 if (!
pad)
return nullptr;
64 e.type == SDL_JOYBUTTONDOWN ?
"joystickpressed" :
"joystickreleased",
65 {Variant::makeInt(
pad->getID()), Variant::makeInt(e.jbutton.button)});
67 case SDL_JOYAXISMOTION: {
68 auto *
pad = joy->getJoystickFromID(e.jaxis.which);
69 if (!
pad)
return nullptr;
70 return new Message(
"joystickaxis",
71 {Variant::makeInt(
pad->getID()), Variant::makeInt(e.jaxis.axis),
72 Variant::makeInt(axisMilli(e.jaxis.value))});
74 case SDL_JOYHATMOTION: {
75 auto *
pad = joy->getJoystickFromID(e.jhat.which);
76 if (!
pad)
return nullptr;
77 return new Message(
"joystickhat",
78 {Variant::makeInt(
pad->getID()), Variant::makeInt(e.jhat.hat),
79 Variant::makeString(
pad->getHat(e.jhat.hat))});
81 case SDL_CONTROLLERBUTTONDOWN:
82 case SDL_CONTROLLERBUTTONUP: {
83 auto *
pad = joy->getJoystickFromID(e.cbutton.which);
84 if (!
pad)
return nullptr;
85 const char *btn = SDL_GameControllerGetStringForButton(
86 static_cast<SDL_GameControllerButton
>(e.cbutton.button));
88 e.type == SDL_CONTROLLERBUTTONDOWN ?
"gamepadpressed" :
"gamepadreleased",
89 {Variant::makeInt(
pad->getID()), Variant::makeString(btn ? btn :
"")});
91 case SDL_CONTROLLERAXISMOTION: {
92 auto *
pad = joy->getJoystickFromID(e.caxis.which);
93 if (!
pad)
return nullptr;
94 const char *axis = SDL_GameControllerGetStringForAxis(
95 static_cast<SDL_GameControllerAxis
>(e.caxis.axis));
96 return new Message(
"gamepadaxis", {Variant::makeInt(
pad->getID()),
97 Variant::makeString(axis ? axis :
""),
98 Variant::makeInt(axisMilli(e.caxis.value))});
108 static JoystickEventSink sink;
109 eve::cap::addListener<eve::platform_event::IPlatformEventSink>(&sink,