12[[nodiscard]]
static Event parseKeyEvent(std::string_view str, uint32_t unicode)
19 return Event::create<KeyUpEvent>(keyCode);
21 return Event::create<KeyDownEvent>(keyCode, unicode);
27 auto len = str.getListLength(interp);
29 return Event::create<GroupEvent>(
32 }
else if (len == 2) {
33 auto comp1 = str.getListIndex(interp, 1).getString();
34 return parseKeyEvent(comp1, 0);
35 }
else if (len == 3) {
36 auto comp1 = str.getListIndex(interp, 1).getString();
37 auto comp2 = str.getListIndex(interp, 2).getString();
38 if (comp2.starts_with(
"unicode")) {
39 if (
auto u = StringOp::stringToBase<10, unsigned>(comp2.substr(7))) {
40 return parseKeyEvent(comp1, *u);
47[[nodiscard]]
static bool upDown(std::string_view str)
51 }
else if (str ==
"down") {
55 "Invalid direction (expected 'up' or 'down'): ", str);
60 auto len = str.getListLength(interp);
62 auto comp1 = str.getListIndex(interp, 1).getString();
63 if (comp1 ==
"motion") {
65 return Event::create<GroupEvent>(
68 }
else if (len ==
one_of(4u, 6u)) {
69 int absX = 0, absY = 0;
71 absX = str.getListIndex(interp, 4).getInt(interp);
72 absY = str.getListIndex(interp, 5).getInt(interp);
76 return Event::create<MouseMotionEvent>(
77 str.getListIndex(interp, 2).getInt(interp),
78 str.getListIndex(interp, 3).getInt(interp),
81 }
else if (comp1.starts_with(
"button")) {
83 return Event::create<GroupEvent>(
86 }
else if (len == 3) {
87 if (
auto button = StringOp::stringToBase<10, unsigned>(comp1.substr(6))) {
88 if (upDown(str.getListIndex(interp, 2).getString())) {
89 return Event::create<MouseButtonUpEvent> (*button);
91 return Event::create<MouseButtonDownEvent>(*button);
95 }
else if (comp1 ==
"wheel") {
97 return Event::create<GroupEvent>(
100 }
else if (len == 4) {
101 return Event::create<MouseWheelEvent>(
102 str.getListIndex(interp, 2).getInt(interp),
103 str.getListIndex(interp, 3).getInt(interp));
112 if (str.getListLength(interp) == 3) {
113 auto buttonName = str.getListIndex(interp, 1).getString();
114 unsigned button = [&] {
115 if (buttonName ==
"LEFT") {
117 }
else if (buttonName ==
"RIGHT") {
119 }
else if (buttonName ==
"UP") {
121 }
else if (buttonName ==
"DOWN") {
123 }
else if (buttonName ==
"A") {
125 }
else if (buttonName ==
"B") {
129 "Invalid OSDcontrol event, invalid button name: ",
133 auto buttonAction = str.getListIndex(interp, 2).getString();
134 if (buttonAction ==
"RELEASE") {
135 return Event::create<OsdControlReleaseEvent>(button,
Event{});
136 }
else if (buttonAction ==
"PRESS") {
137 return Event::create<OsdControlPressEvent> (button,
Event{});
145 auto len = str.getListLength(interp);
147 auto comp0 = str.getListIndex(interp, 0).getString();
148 auto comp1 = str.getListIndex(interp, 1).getString();
151 if (comp1.starts_with(
"button")) {
152 return Event::create<GroupEvent>(
155 }
else if (comp1.starts_with(
"axis")) {
156 return Event::create<GroupEvent>(
159 }
else if (comp1.starts_with(
"hat")) {
160 return Event::create<GroupEvent>(
164 }
else if (len == 3) {
165 auto comp2 = str.getListIndex(interp, 2);
166 if (
auto j = StringOp::stringToBase<10, unsigned>(comp0.substr(3))) {
167 unsigned joystick = *j - 1;
168 if (comp1.starts_with(
"button")) {
169 if (
auto button = StringOp::stringToBase<10, unsigned>(comp1.substr(6))) {
170 if (upDown(comp2.getString())) {
171 return Event::create<JoystickButtonUpEvent> (joystick, *button);
173 return Event::create<JoystickButtonDownEvent>(joystick, *button);
176 }
else if (comp1.starts_with(
"axis")) {
177 if (
auto axis = StringOp::stringToBase<10, unsigned>(comp1.substr(4))) {
178 int value = str.getListIndex(interp, 2).getInt(interp);
179 return Event::create<JoystickAxisMotionEvent>(joystick, *axis, value);
181 }
else if (comp1.starts_with(
"hat")) {
182 if (
auto hat = StringOp::stringToBase<10, unsigned>(comp1.substr(3))) {
183 auto valueStr = str.getListIndex(interp, 2).getString();
185 if (valueStr ==
"up")
return SDL_HAT_UP;
186 else if (valueStr ==
"right")
return SDL_HAT_RIGHT;
187 else if (valueStr ==
"down")
return SDL_HAT_DOWN;
188 else if (valueStr ==
"left")
return SDL_HAT_LEFT;
189 else if (valueStr ==
"rightup")
return SDL_HAT_RIGHTUP;
190 else if (valueStr ==
"rightdown")
return SDL_HAT_RIGHTDOWN;
191 else if (valueStr ==
"leftup")
return SDL_HAT_LEFTUP;
192 else if (valueStr ==
"leftdown")
return SDL_HAT_LEFTDOWN;
193 else if (valueStr ==
"center")
return SDL_HAT_CENTERED;
198 return Event::create<JoystickHatEvent>(joystick, *hat, value);
209 if (str.getListLength(interp) != 2) {
212 return Event::create<FocusEvent>(str.getListIndex(interp, 1).getBoolean(interp));
217 if (str.getListLength(interp) != 1) {
220 return Event::create<GroupEvent>(
227 if (str.getListLength(interp) != 3) {
230 return Event::create<ResizeEvent>(
231 str.getListIndex(interp, 1).getInt(interp),
232 str.getListIndex(interp, 2).getInt(interp));
237 if (str.getListLength(interp) != 1) {
240 return Event::create<QuitEvent>();
249 if (type ==
"keyb") {
250 return parseKeyEvent(str, interp);
251 }
else if (type ==
"mouse") {
252 return parseMouseEvent(str, interp);
253 }
else if (type.starts_with(
"joy")) {
254 return parseJoystickEvent(str, interp);
255 }
else if (type ==
"focus") {
256 return parseFocusEvent(str, interp);
257 }
else if (type ==
"filedrop") {
258 return parseFileDropEvent(str, interp);
259 }
else if (type ==
"resize") {
260 return parseResizeEvent(str, interp);
261 }
else if (type ==
"quit") {
262 return parseQuitEvent(str, interp);
263 }
else if (type ==
"command") {
266 }
else if (type ==
"OSDcontrol") {
267 return parseOsdControlEvent(str, interp);
270 return parseKeyEvent(type, 0);
unsigned getListLength(Interpreter &interp) const
TclObject getListIndex(Interpreter &interp, unsigned index) const
zstring_view getString() const
KeyCode getCode(string_view name)
Translate key name to key code.
TclObject makeTclList(Args &&... args)