10 using std::make_shared;
14 [[nodiscard]]
static EventPtr parseKeyEvent(std::string_view str, uint32_t unicode)
21 return make_shared<KeyUpEvent>(keyCode);
23 return make_shared<KeyDownEvent>(keyCode, unicode);
29 auto len = str.getListLength(interp);
31 return make_shared<GroupEvent>(
35 }
else if (len == 2) {
36 auto comp1 = str.getListIndex(interp, 1).getString();
37 return parseKeyEvent(comp1, 0);
38 }
else if (len == 3) {
39 auto comp1 = str.getListIndex(interp, 1).getString();
40 auto comp2 = str.getListIndex(interp, 2).getString();
42 if (
auto u = StringOp::stringToBase<10, unsigned>(comp2.substr(7))) {
43 return parseKeyEvent(comp1, *u);
50 [[nodiscard]]
static bool upDown(std::string_view str)
54 }
else if (str ==
"down") {
58 "Invalid direction (expected 'up' or 'down'): ", str);
63 auto len = str.getListLength(interp);
65 auto comp1 = str.getListIndex(interp, 1).getString();
66 if (comp1 ==
"motion") {
68 return make_shared<GroupEvent>(
72 }
else if (len ==
one_of(4u, 6u)) {
73 int absX = 0, absY = 0;
75 absX = str.getListIndex(interp, 4).getInt(interp);
76 absY = str.getListIndex(interp, 5).getInt(interp);
80 return make_shared<MouseMotionEvent>(
81 str.getListIndex(interp, 2).getInt(interp),
82 str.getListIndex(interp, 3).getInt(interp),
87 return make_shared<GroupEvent>(
91 }
else if (len == 3) {
92 if (
auto button = StringOp::stringToBase<10, unsigned>(comp1.substr(6))) {
93 if (upDown(str.getListIndex(interp, 2).getString())) {
94 return make_shared<MouseButtonUpEvent> (*button);
96 return make_shared<MouseButtonDownEvent>(*button);
100 }
else if (comp1 ==
"wheel") {
102 return make_shared<GroupEvent>(
106 }
else if (len == 4) {
107 return make_shared<MouseWheelEvent>(
108 str.getListIndex(interp, 2).getInt(interp),
109 str.getListIndex(interp, 3).getInt(interp));
118 if (str.getListLength(interp) == 3) {
119 auto buttonName = str.getListIndex(interp, 1).getString();
120 unsigned button = [&] {
121 if (buttonName ==
"LEFT") {
123 }
else if (buttonName ==
"RIGHT") {
125 }
else if (buttonName ==
"UP") {
127 }
else if (buttonName ==
"DOWN") {
129 }
else if (buttonName ==
"A") {
131 }
else if (buttonName ==
"B") {
135 "Invalid OSDcontrol event, invalid button name: ",
139 auto buttonAction = str.getListIndex(interp, 2).getString();
140 if (buttonAction ==
"RELEASE") {
141 return make_shared<OsdControlReleaseEvent>(button,
nullptr);
142 }
else if (buttonAction ==
"PRESS") {
143 return make_shared<OsdControlPressEvent> (button,
nullptr);
151 auto len = str.getListLength(interp);
153 auto comp0 = str.getListIndex(interp, 0).getString();
154 auto comp1 = str.getListIndex(interp, 1).getString();
158 return make_shared<GroupEvent>(
163 return make_shared<GroupEvent>(
168 return make_shared<GroupEvent>(
173 }
else if (len == 3) {
174 auto comp2 = str.getListIndex(interp, 2);
175 if (
auto j = StringOp::stringToBase<10, unsigned>(comp0.substr(3))) {
176 unsigned joystick = *j - 1;
178 if (
auto button = StringOp::stringToBase<10, unsigned>(comp1.substr(6))) {
179 if (upDown(comp2.getString())) {
180 return make_shared<JoystickButtonUpEvent> (joystick, *button);
182 return make_shared<JoystickButtonDownEvent>(joystick, *button);
186 if (
auto axis = StringOp::stringToBase<10, unsigned>(comp1.substr(4))) {
187 int value = str.getListIndex(interp, 2).getInt(interp);
188 return make_shared<JoystickAxisMotionEvent>(joystick, *axis, value);
191 if (
auto hat = StringOp::stringToBase<10, unsigned>(comp1.substr(3))) {
192 auto valueStr = str.getListIndex(interp, 2).getString();
194 if (valueStr ==
"up")
return SDL_HAT_UP;
195 else if (valueStr ==
"right")
return SDL_HAT_RIGHT;
196 else if (valueStr ==
"down")
return SDL_HAT_DOWN;
197 else if (valueStr ==
"left")
return SDL_HAT_LEFT;
198 else if (valueStr ==
"rightup")
return SDL_HAT_RIGHTUP;
199 else if (valueStr ==
"rightdown")
return SDL_HAT_RIGHTDOWN;
200 else if (valueStr ==
"leftup")
return SDL_HAT_LEFTUP;
201 else if (valueStr ==
"leftdown")
return SDL_HAT_LEFTDOWN;
202 else if (valueStr ==
"center")
return SDL_HAT_CENTERED;
207 return make_shared<JoystickHatEvent>(joystick, *hat, value);
218 if (str.getListLength(interp) != 2) {
221 return make_shared<FocusEvent>(str.getListIndex(interp, 1).getBoolean(interp));
226 if (str.getListLength(interp) != 1) {
229 return make_shared<GroupEvent>(
237 if (str.getListLength(interp) != 3) {
240 return make_shared<ResizeEvent>(
241 str.getListIndex(interp, 1).getInt(interp),
242 str.getListIndex(interp, 2).getInt(interp));
247 if (str.getListLength(interp) != 1) {
250 return make_shared<QuitEvent>();
259 if (type ==
"keyb") {
260 return parseKeyEvent(str, interp);
261 }
else if (type ==
"mouse") {
262 return parseMouseEvent(str, interp);
264 return parseJoystickEvent(str, interp);
265 }
else if (type ==
"focus") {
266 return parseFocusEvent(str, interp);
267 }
else if (type ==
"filedrop") {
268 return parseFileDropEvent(str, interp);
269 }
else if (type ==
"resize") {
270 return parseResizeEvent(str, interp);
271 }
else if (type ==
"quit") {
272 return parseQuitEvent(str, interp);
273 }
else if (type ==
"command") {
276 }
else if (type ==
"OSDcontrol") {
277 return parseOsdControlEvent(str, interp);
280 return parseKeyEvent(type, 0);
unsigned getListLength(Interpreter &interp) const
TclObject getListIndex(Interpreter &interp, unsigned index) const
zstring_view getString() const
bool startsWith(string_view total, string_view part)
KeyCode getCode(string_view name)
Translate key name to key code.
@ OPENMSX_MOUSE_BUTTON_DOWN_EVENT
@ OPENMSX_MOUSE_BUTTON_UP_EVENT
@ OPENMSX_JOY_HAT_GROUP_EVENT
@ OPENMSX_JOY_AXIS_MOTION_GROUP_EVENT
@ OPENMSX_FILEDROP_GROUP_EVENT
@ OPENMSX_JOY_BUTTON_GROUP_EVENT
@ OPENMSX_MOUSE_WHEEL_EVENT
@ OPENMSX_MOUSE_MOTION_EVENT
@ OPENMSX_MOUSE_WHEEL_GROUP_EVENT
@ OPENMSX_KEY_GROUP_EVENT
@ OPENMSX_JOY_BUTTON_UP_EVENT
@ OPENMSX_JOY_BUTTON_DOWN_EVENT
@ OPENMSX_MOUSE_BUTTON_GROUP_EVENT
@ OPENMSX_MOUSE_MOTION_GROUP_EVENT
@ OPENMSX_JOY_AXIS_MOTION_EVENT
TclObject makeTclList(Args &&... args)