12[[nodiscard]]
static Event parseKeyEvent(std::string_view str, uint32_t unicode)
20 SDL_KeyboardEvent&
e = evt.key;
21 e.timestamp = SDL_GetTicks();
23 e.keysym.unused = unicode;
26 e.state = SDL_PRESSED;
30 e.state = SDL_RELEASED;
37 auto len = str.getListLength(interp);
42 }
else if (len == 2) {
43 auto comp1 = str.getListIndex(interp, 1).getString();
44 return parseKeyEvent(comp1, 0);
45 }
else if (len == 3) {
46 auto comp1 = str.getListIndex(interp, 1).getString();
47 auto comp2 = str.getListIndex(interp, 2).getString();
48 if (comp2.starts_with(
"unicode")) {
49 if (
auto u = StringOp::stringToBase<10, unsigned>(comp2.substr(7))) {
50 return parseKeyEvent(comp1, *u);
57[[nodiscard]]
static bool upDown(std::string_view str)
61 }
else if (str ==
"down") {
65 "Invalid direction (expected 'up' or 'down'): ", str);
70 auto len = str.getListLength(interp);
72 auto comp1 = str.getListIndex(interp, 1).getString();
73 if (comp1 ==
"motion") {
78 }
else if (len ==
one_of(4u, 6u)) {
79 int absX = 0, absY = 0;
81 absX = str.getListIndex(interp, 4).getInt(interp);
82 absY = str.getListIndex(interp, 5).getInt(interp);
87 SDL_MouseMotionEvent&
e = evt.motion;
88 e.type = SDL_MOUSEMOTION;
89 e.timestamp = SDL_GetTicks();
92 e.xrel = str.getListIndex(interp, 2).getInt(interp);
93 e.yrel = str.getListIndex(interp, 3).getInt(interp);
96 }
else if (comp1.starts_with(
"button")) {
101 }
else if (len == 3) {
102 if (
auto button = StringOp::stringToBase<10, unsigned>(comp1.substr(6))) {
104 SDL_MouseButtonEvent&
e = evt.button;
105 e.timestamp = SDL_GetTicks();
106 e.button = narrow<uint8_t>(*button);
107 if (upDown(str.getListIndex(interp, 2).getString())) {
108 e.type = SDL_MOUSEBUTTONUP;
109 e.state = SDL_RELEASED;
112 e.type = SDL_MOUSEBUTTONDOWN;
113 e.state = SDL_PRESSED;
118 }
else if (comp1 ==
"wheel") {
123 }
else if (len == 4) {
125 SDL_MouseWheelEvent&
e = evt.wheel;
126 e.type = SDL_MOUSEWHEEL;
127 e.timestamp = SDL_GetTicks();
128 e.direction = SDL_MOUSEWHEEL_NORMAL;
129 e.x = str.getListIndex(interp, 2).getInt(interp);
130 e.y = str.getListIndex(interp, 3).getInt(interp);
131 #if (SDL_VERSION_ATLEAST(2, 0, 18))
132 e.preciseX = narrow_cast<float>(
e.x);
133 e.preciseY = narrow_cast<float>(
e.y);
144 if (str.getListLength(interp) == 3) {
145 auto buttonName = str.getListIndex(interp, 1).getString();
146 unsigned button = [&] {
147 if (buttonName ==
"LEFT") {
149 }
else if (buttonName ==
"RIGHT") {
151 }
else if (buttonName ==
"UP") {
153 }
else if (buttonName ==
"DOWN") {
155 }
else if (buttonName ==
"A") {
157 }
else if (buttonName ==
"B") {
161 "Invalid OSDcontrol event, invalid button name: ",
165 auto buttonAction = str.getListIndex(interp, 2).getString();
166 if (buttonAction ==
"RELEASE") {
168 }
else if (buttonAction ==
"PRESS") {
177 auto len = str.getListLength(interp);
179 auto comp0 = str.getListIndex(interp, 0).getString();
180 auto comp1 = str.getListIndex(interp, 1).getString();
183 if (comp1.starts_with(
"button")) {
187 }
else if (comp1.starts_with(
"axis")) {
191 }
else if (comp1.starts_with(
"hat")) {
196 }
else if (len == 3) {
197 auto comp2 = str.getListIndex(interp, 2);
198 if (
auto j = StringOp::stringToBase<10, unsigned>(comp0.substr(3))) {
199 unsigned joystick = *j - 1;
200 if (comp1.starts_with(
"button")) {
201 if (
auto button = StringOp::stringToBase<10, unsigned>(comp1.substr(6))) {
203 SDL_JoyButtonEvent&
e = evt.jbutton;
204 e.timestamp = SDL_GetTicks();
206 e.button = narrow_cast<uint8_t>(*button);
207 if (upDown(comp2.getString())) {
208 e.type = SDL_JOYBUTTONUP;
209 e.state = SDL_RELEASED;
212 e.type = SDL_JOYBUTTONDOWN;
213 e.state = SDL_PRESSED;
217 }
else if (comp1.starts_with(
"axis")) {
218 if (
auto axis = StringOp::stringToBase<10, unsigned>(comp1.substr(4))) {
220 SDL_JoyAxisEvent&
e = evt.jaxis;
221 e.type = SDL_JOYAXISMOTION;
222 e.timestamp = SDL_GetTicks();
224 e.axis = narrow_cast<uint8_t>(*axis);
225 e.value = narrow_cast<int16_t>(str.getListIndex(interp, 2).getInt(interp));
228 }
else if (comp1.starts_with(
"hat")) {
229 if (
auto hat = StringOp::stringToBase<10, unsigned>(comp1.substr(3))) {
230 auto valueStr = str.getListIndex(interp, 2).getString();
232 if (valueStr ==
"up")
return SDL_HAT_UP;
233 else if (valueStr ==
"right")
return SDL_HAT_RIGHT;
234 else if (valueStr ==
"down")
return SDL_HAT_DOWN;
235 else if (valueStr ==
"left")
return SDL_HAT_LEFT;
236 else if (valueStr ==
"rightup")
return SDL_HAT_RIGHTUP;
237 else if (valueStr ==
"rightdown")
return SDL_HAT_RIGHTDOWN;
238 else if (valueStr ==
"leftup")
return SDL_HAT_LEFTUP;
239 else if (valueStr ==
"leftdown")
return SDL_HAT_LEFTDOWN;
240 else if (valueStr ==
"center")
return SDL_HAT_CENTERED;
246 SDL_JoyHatEvent&
e = evt.jhat;
247 e.type = SDL_JOYHATMOTION;
248 e.timestamp = SDL_GetTicks();
250 e.hat = narrow_cast<uint8_t>(*hat);
251 e.value = narrow_cast<uint8_t>(value);
263 if (str.getListLength(interp) != 2) {
266 bool gained = str.getListIndex(interp, 1).getBoolean(interp);
269 SDL_WindowEvent&
e = evt.window;
270 e.type = SDL_WINDOWEVENT;
271 e.timestamp = SDL_GetTicks();
273 e.event = gained ? SDL_WINDOWEVENT_FOCUS_GAINED : SDL_WINDOWEVENT_FOCUS_LOST;
279 if (str.getListLength(interp) != 1) {
289 if (str.getListLength(interp) != 1) {
301 if (type ==
"keyb") {
302 return parseKeyEvent(str, interp);
303 }
else if (type ==
"mouse") {
304 return parseMouseEvent(str, interp);
305 }
else if (type.starts_with(
"joy")) {
306 return parseJoystickEvent(str, interp);
307 }
else if (type ==
"focus") {
308 return parseFocusEvent(str, interp);
309 }
else if (type ==
"filedrop") {
310 return parseFileDropEvent(str, interp);
311 }
else if (type ==
"quit") {
312 return parseQuitEvent(str, interp);
313 }
else if (type ==
"command") {
315 evt.key.type = SDL_KEYUP;
316 evt.key.state = SDL_RELEASED;
319 }
else if (type ==
"OSDcontrol") {
320 return parseOsdControlEvent(str, interp);
323 return parseKeyEvent(str.
getString(), 0);
unsigned getListLength(Interpreter &interp) const
TclObject getListIndex(Interpreter &interp, unsigned index) const
zstring_view getString() const
static uint32_t getMainWindowId()
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, ImGuiDelayedActionEvent, ImGuiActiveEvent > Event
TclObject makeTclList(Args &&... args)
static std::optional< SDLKey > fromString(std::string_view name)