12[[nodiscard]]
static Event parseKeyEvent(std::string_view str, uint32_t unicode)
20 evt.key = SDL_KeyboardEvent{};
23 e.timestamp = SDL_GetTicks();
25 e.keysym.unused = unicode;
28 e.state = SDL_PRESSED;
32 e.state = SDL_RELEASED;
39 auto len = str.getListLength(interp);
44 }
else if (len == 2) {
45 auto comp1 = str.getListIndex(interp, 1).getString();
46 return parseKeyEvent(comp1, 0);
47 }
else if (len == 3) {
48 auto comp1 = str.getListIndex(interp, 1).getString();
49 auto comp2 = str.getListIndex(interp, 2).getString();
50 if (comp2.starts_with(
"unicode")) {
51 if (
auto u = StringOp::stringToBase<10, unsigned>(comp2.substr(7))) {
52 return parseKeyEvent(comp1, *u);
59[[nodiscard]]
static bool upDown(std::string_view str)
63 }
else if (str ==
"down") {
67 "Invalid direction (expected 'up' or 'down'): ", str);
72 auto len = str.getListLength(interp);
74 auto comp1 = str.getListIndex(interp, 1).getString();
75 if (comp1 ==
"motion") {
80 }
else if (len ==
one_of(4u, 6u)) {
81 int absX = 0, absY = 0;
83 absX = str.getListIndex(interp, 4).getInt(interp);
84 absY = str.getListIndex(interp, 5).getInt(interp);
90 evt.motion = SDL_MouseMotionEvent{};
93 e.type = SDL_MOUSEMOTION;
94 e.timestamp = SDL_GetTicks();
97 e.xrel = str.getListIndex(interp, 2).getInt(interp);
98 e.yrel = str.getListIndex(interp, 3).getInt(interp);
101 }
else if (comp1.starts_with(
"button")) {
106 }
else if (len == 3) {
107 if (
auto button = StringOp::stringToBase<10, unsigned>(comp1.substr(6))) {
109 evt.button = SDL_MouseButtonEvent{};
110 auto& e = evt.button;
112 e.timestamp = SDL_GetTicks();
113 e.button = narrow<uint8_t>(*button);
114 if (upDown(str.getListIndex(interp, 2).getString())) {
115 e.type = SDL_MOUSEBUTTONUP;
116 e.state = SDL_RELEASED;
119 e.type = SDL_MOUSEBUTTONDOWN;
120 e.state = SDL_PRESSED;
125 }
else if (comp1 ==
"wheel") {
130 }
else if (len == 4) {
132 evt.wheel = SDL_MouseWheelEvent{};
135 e.type = SDL_MOUSEWHEEL;
136 e.timestamp = SDL_GetTicks();
137 e.direction = SDL_MOUSEWHEEL_NORMAL;
138 e.x = str.getListIndex(interp, 2).getInt(interp);
139 e.y = str.getListIndex(interp, 3).getInt(interp);
140 #if (SDL_VERSION_ATLEAST(2, 0, 18))
141 e.preciseX = narrow_cast<float>(e.x);
142 e.preciseY = narrow_cast<float>(e.y);
153 if (str.getListLength(interp) == 3) {
154 auto buttonName = str.getListIndex(interp, 1).getString();
155 unsigned button = [&] {
156 if (buttonName ==
"LEFT") {
158 }
else if (buttonName ==
"RIGHT") {
160 }
else if (buttonName ==
"UP") {
162 }
else if (buttonName ==
"DOWN") {
164 }
else if (buttonName ==
"A") {
166 }
else if (buttonName ==
"B") {
170 "Invalid OSDcontrol event, invalid button name: ",
174 auto buttonAction = str.getListIndex(interp, 2).getString();
175 if (buttonAction ==
"RELEASE") {
177 }
else if (buttonAction ==
"PRESS") {
186 auto len = str.getListLength(interp);
188 auto comp0 = str.getListIndex(interp, 0).getString();
189 auto comp1 = str.getListIndex(interp, 1).getString();
193 if (comp1.starts_with(
"button")) {
197 }
else if (comp1.starts_with(
"axis")) {
201 }
else if (comp1.starts_with(
"hat")) {
203 std::initializer_list<EventType>{
JOY_HAT},
206 }
else if (len == 3) {
207 auto comp2 = str.getListIndex(interp, 2);
208 if (
auto j = StringOp::stringToBase<10, unsigned>(comp0.substr(3))) {
209 unsigned joystick = *j - 1;
210 if (comp1.starts_with(
"button")) {
211 if (
auto button = StringOp::stringToBase<10, unsigned>(comp1.substr(6))) {
213 evt.jbutton = SDL_JoyButtonEvent{};
214 auto& e = evt.jbutton;
216 e.timestamp = SDL_GetTicks();
218 e.button = narrow_cast<uint8_t>(*button);
219 if (upDown(comp2.getString())) {
220 e.type = SDL_JOYBUTTONUP;
221 e.state = SDL_RELEASED;
224 e.type = SDL_JOYBUTTONDOWN;
225 e.state = SDL_PRESSED;
229 }
else if (comp1.starts_with(
"axis")) {
230 if (
auto axis = StringOp::stringToBase<10, unsigned>(comp1.substr(4))) {
232 evt.jaxis = SDL_JoyAxisEvent{};
235 e.type = SDL_JOYAXISMOTION;
236 e.timestamp = SDL_GetTicks();
238 e.axis = narrow_cast<uint8_t>(*axis);
239 e.value = narrow_cast<int16_t>(str.getListIndex(interp, 2).getInt(interp));
242 }
else if (comp1.starts_with(
"hat")) {
243 if (
auto hat = StringOp::stringToBase<10, unsigned>(comp1.substr(3))) {
244 auto valueStr = str.getListIndex(interp, 2).getString();
246 if (valueStr ==
"up")
return SDL_HAT_UP;
247 else if (valueStr ==
"right")
return SDL_HAT_RIGHT;
248 else if (valueStr ==
"down")
return SDL_HAT_DOWN;
249 else if (valueStr ==
"left")
return SDL_HAT_LEFT;
250 else if (valueStr ==
"rightup")
return SDL_HAT_RIGHTUP;
251 else if (valueStr ==
"rightdown")
return SDL_HAT_RIGHTDOWN;
252 else if (valueStr ==
"leftup")
return SDL_HAT_LEFTUP;
253 else if (valueStr ==
"leftdown")
return SDL_HAT_LEFTDOWN;
254 else if (valueStr ==
"center")
return SDL_HAT_CENTERED;
260 evt.jhat = SDL_JoyHatEvent{};
263 e.type = SDL_JOYHATMOTION;
264 e.timestamp = SDL_GetTicks();
266 e.hat = narrow_cast<uint8_t>(*hat);
267 e.value = narrow_cast<uint8_t>(value);
279 if (str.getListLength(interp) != 2) {
282 bool gained = str.getListIndex(interp, 1).getBoolean(interp);
285 evt.window = SDL_WindowEvent{};
286 auto& e = evt.window;
288 e.type = SDL_WINDOWEVENT;
289 e.timestamp = SDL_GetTicks();
291 e.event = gained ? SDL_WINDOWEVENT_FOCUS_GAINED : SDL_WINDOWEVENT_FOCUS_LOST;
297 if (str.getListLength(interp) != 1) {
307 if (str.getListLength(interp) != 1) {
319 if (type ==
"keyb") {
320 return parseKeyEvent(str, interp);
321 }
else if (type ==
"mouse") {
322 return parseMouseEvent(str, interp);
323 }
else if (type.starts_with(
"joy")) {
324 return parseJoystickEvent(str, interp);
325 }
else if (type ==
"focus") {
326 return parseFocusEvent(str, interp);
327 }
else if (type ==
"filedrop") {
328 return parseFileDropEvent(str, interp);
329 }
else if (type ==
"quit") {
330 return parseQuitEvent(str, interp);
331 }
else if (type ==
"command") {
333 evt.key = SDL_KeyboardEvent{};
334 evt.key.type = SDL_KEYUP;
335 evt.key.state = SDL_RELEASED;
338 }
else if (type ==
"OSDcontrol") {
339 return parseOsdControlEvent(str, interp);
342 return parseKeyEvent(str.
getString(), 0);
std::variant< KeyUpEvent, KeyDownEvent, MouseMotionEvent, MouseButtonUpEvent, MouseButtonDownEvent, MouseWheelEvent, JoystickAxisMotionEvent, JoystickHatEvent, JoystickButtonUpEvent, JoystickButtonDownEvent, OsdControlReleaseEvent, OsdControlPressEvent, WindowEvent, TextEvent, FileDropEvent, QuitEvent, FinishFrameEvent, CliCommandEvent, GroupEvent, BootEvent, FrameDrawnEvent, BreakEvent, SwitchRendererEvent, TakeReverseSnapshotEvent, AfterTimedEvent, MachineLoadedEvent, MachineActivatedEvent, MachineDeactivatedEvent, MidiInReaderEvent, MidiInWindowsEvent, MidiInCoreMidiEvent, MidiInCoreMidiVirtualEvent, MidiInALSAEvent, Rs232TesterEvent, Rs232NetEvent, ImGuiDelayedActionEvent, ImGuiActiveEvent > Event