1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "SDL_internal.h"
22
23// SDL event categories
24
25#include "SDL_events_c.h"
26#include "SDL_categories_c.h"
27
28SDL_EventCategory SDL_GetEventCategory(Uint32 type)
29{
30 if (type >= SDL_EVENT_USER && type <= SDL_EVENT_LAST) {
31 return SDL_EVENTCATEGORY_USER;
32 }
33 else if (type >= SDL_EVENT_DISPLAY_FIRST && type <= SDL_EVENT_DISPLAY_LAST) {
34 return SDL_EVENTCATEGORY_DISPLAY;
35 }
36 else if (type >= SDL_EVENT_WINDOW_FIRST && type <= SDL_EVENT_WINDOW_LAST) {
37 return SDL_EVENTCATEGORY_WINDOW;
38 }
39 switch (type) {
40 default:
41 SDL_SetError("Unknown event type");
42 return SDL_EVENTCATEGORY_UNKNOWN;
43
44 case SDL_EVENT_KEYMAP_CHANGED:
45 case SDL_EVENT_TERMINATING:
46 case SDL_EVENT_LOW_MEMORY:
47 case SDL_EVENT_WILL_ENTER_BACKGROUND:
48 case SDL_EVENT_DID_ENTER_BACKGROUND:
49 case SDL_EVENT_WILL_ENTER_FOREGROUND:
50 case SDL_EVENT_DID_ENTER_FOREGROUND:
51 case SDL_EVENT_LOCALE_CHANGED:
52 case SDL_EVENT_SYSTEM_THEME_CHANGED:
53 return SDL_EVENTCATEGORY_SYSTEM;
54
55 case SDL_EVENT_RENDER_TARGETS_RESET:
56 case SDL_EVENT_RENDER_DEVICE_RESET:
57 case SDL_EVENT_RENDER_DEVICE_LOST:
58 return SDL_EVENTCATEGORY_RENDER;
59
60 case SDL_EVENT_QUIT:
61 return SDL_EVENTCATEGORY_QUIT;
62
63 case SDL_EVENT_KEY_DOWN:
64 case SDL_EVENT_KEY_UP:
65 return SDL_EVENTCATEGORY_KEY;
66
67 case SDL_EVENT_TEXT_EDITING:
68 return SDL_EVENTCATEGORY_EDIT;
69
70 case SDL_EVENT_TEXT_INPUT:
71 return SDL_EVENTCATEGORY_TEXT;
72
73 case SDL_EVENT_KEYBOARD_ADDED:
74 case SDL_EVENT_KEYBOARD_REMOVED:
75 return SDL_EVENTCATEGORY_KDEVICE;
76
77 case SDL_EVENT_TEXT_EDITING_CANDIDATES:
78 return SDL_EVENTCATEGORY_EDIT_CANDIDATES;
79
80 case SDL_EVENT_MOUSE_MOTION:
81 return SDL_EVENTCATEGORY_MOTION;
82
83 case SDL_EVENT_MOUSE_BUTTON_DOWN:
84 case SDL_EVENT_MOUSE_BUTTON_UP:
85 return SDL_EVENTCATEGORY_BUTTON;
86
87 case SDL_EVENT_MOUSE_WHEEL:
88 return SDL_EVENTCATEGORY_WHEEL;
89
90 case SDL_EVENT_MOUSE_ADDED:
91 case SDL_EVENT_MOUSE_REMOVED:
92 return SDL_EVENTCATEGORY_MDEVICE;
93
94 case SDL_EVENT_JOYSTICK_AXIS_MOTION:
95 return SDL_EVENTCATEGORY_JAXIS;
96
97 case SDL_EVENT_JOYSTICK_BALL_MOTION:
98 return SDL_EVENTCATEGORY_JBALL;
99
100 case SDL_EVENT_JOYSTICK_HAT_MOTION:
101 return SDL_EVENTCATEGORY_JHAT;
102
103 case SDL_EVENT_JOYSTICK_BUTTON_DOWN:
104 case SDL_EVENT_JOYSTICK_BUTTON_UP:
105 return SDL_EVENTCATEGORY_JBUTTON;
106
107 case SDL_EVENT_JOYSTICK_ADDED:
108 case SDL_EVENT_JOYSTICK_REMOVED:
109 case SDL_EVENT_JOYSTICK_UPDATE_COMPLETE:
110 return SDL_EVENTCATEGORY_JDEVICE;
111
112 case SDL_EVENT_JOYSTICK_BATTERY_UPDATED:
113 return SDL_EVENTCATEGORY_JBATTERY;
114
115 case SDL_EVENT_GAMEPAD_AXIS_MOTION:
116 return SDL_EVENTCATEGORY_GAXIS;
117
118 case SDL_EVENT_GAMEPAD_BUTTON_DOWN:
119 case SDL_EVENT_GAMEPAD_BUTTON_UP:
120 return SDL_EVENTCATEGORY_GBUTTON;
121
122 case SDL_EVENT_GAMEPAD_ADDED:
123 case SDL_EVENT_GAMEPAD_REMOVED:
124 case SDL_EVENT_GAMEPAD_REMAPPED:
125 case SDL_EVENT_GAMEPAD_UPDATE_COMPLETE:
126 case SDL_EVENT_GAMEPAD_STEAM_HANDLE_UPDATED:
127 return SDL_EVENTCATEGORY_GDEVICE;
128
129 case SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN:
130 case SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION:
131 case SDL_EVENT_GAMEPAD_TOUCHPAD_UP:
132 return SDL_EVENTCATEGORY_GTOUCHPAD;
133
134 case SDL_EVENT_GAMEPAD_SENSOR_UPDATE:
135 return SDL_EVENTCATEGORY_GSENSOR;
136
137 case SDL_EVENT_FINGER_DOWN:
138 case SDL_EVENT_FINGER_UP:
139 case SDL_EVENT_FINGER_CANCELED:
140 case SDL_EVENT_FINGER_MOTION:
141 return SDL_EVENTCATEGORY_TFINGER;
142
143 case SDL_EVENT_CLIPBOARD_UPDATE:
144 return SDL_EVENTCATEGORY_CLIPBOARD;
145
146 case SDL_EVENT_DROP_FILE:
147 case SDL_EVENT_DROP_TEXT:
148 case SDL_EVENT_DROP_BEGIN:
149 case SDL_EVENT_DROP_COMPLETE:
150 case SDL_EVENT_DROP_POSITION:
151 return SDL_EVENTCATEGORY_DROP;
152
153 case SDL_EVENT_AUDIO_DEVICE_ADDED:
154 case SDL_EVENT_AUDIO_DEVICE_REMOVED:
155 case SDL_EVENT_AUDIO_DEVICE_FORMAT_CHANGED:
156 return SDL_EVENTCATEGORY_ADEVICE;
157
158 case SDL_EVENT_SENSOR_UPDATE:
159 return SDL_EVENTCATEGORY_SENSOR;
160
161 case SDL_EVENT_PEN_PROXIMITY_IN:
162 case SDL_EVENT_PEN_PROXIMITY_OUT:
163 return SDL_EVENTCATEGORY_PPROXIMITY;
164
165 case SDL_EVENT_PEN_DOWN:
166 case SDL_EVENT_PEN_UP:
167 return SDL_EVENTCATEGORY_PTOUCH;
168
169 case SDL_EVENT_PEN_BUTTON_DOWN:
170 case SDL_EVENT_PEN_BUTTON_UP:
171 return SDL_EVENTCATEGORY_PBUTTON;
172
173 case SDL_EVENT_PEN_MOTION:
174 return SDL_EVENTCATEGORY_PMOTION;
175
176 case SDL_EVENT_PEN_AXIS:
177 return SDL_EVENTCATEGORY_PAXIS;
178
179 case SDL_EVENT_CAMERA_DEVICE_ADDED:
180 case SDL_EVENT_CAMERA_DEVICE_REMOVED:
181 case SDL_EVENT_CAMERA_DEVICE_APPROVED:
182 case SDL_EVENT_CAMERA_DEVICE_DENIED:
183 return SDL_EVENTCATEGORY_CDEVICE;
184 }
185}
186
187SDL_Window *SDL_GetWindowFromEvent(const SDL_Event *event)
188{
189 SDL_WindowID windowID;
190
191 switch (SDL_GetEventCategory(event->type)) {
192 case SDL_EVENTCATEGORY_USER:
193 windowID = event->user.windowID;
194 break;
195 case SDL_EVENTCATEGORY_WINDOW:
196 windowID = event->window.windowID;
197 break;
198 case SDL_EVENTCATEGORY_KEY:
199 windowID = event->key.windowID;
200 break;
201 case SDL_EVENTCATEGORY_EDIT:
202 windowID = event->edit.windowID;
203 break;
204 case SDL_EVENTCATEGORY_TEXT:
205 windowID = event->text.windowID;
206 break;
207 case SDL_EVENTCATEGORY_EDIT_CANDIDATES:
208 windowID = event->edit_candidates.windowID;
209 break;
210 case SDL_EVENTCATEGORY_MOTION:
211 windowID = event->motion.windowID;
212 break;
213 case SDL_EVENTCATEGORY_BUTTON:
214 windowID = event->button.windowID;
215 break;
216 case SDL_EVENTCATEGORY_WHEEL:
217 windowID = event->wheel.windowID;
218 break;
219 case SDL_EVENTCATEGORY_TFINGER:
220 windowID = event->tfinger.windowID;
221 break;
222 case SDL_EVENTCATEGORY_PPROXIMITY:
223 windowID = event->pproximity.windowID;
224 break;
225 case SDL_EVENTCATEGORY_PTOUCH:
226 windowID = event->ptouch.windowID;
227 break;
228 case SDL_EVENTCATEGORY_PBUTTON:
229 windowID = event->pbutton.windowID;
230 break;
231 case SDL_EVENTCATEGORY_PMOTION:
232 windowID = event->pmotion.windowID;
233 break;
234 case SDL_EVENTCATEGORY_PAXIS:
235 windowID = event->paxis.windowID;
236 break;
237 case SDL_EVENTCATEGORY_DROP:
238 windowID = event->drop.windowID;
239 break;
240 case SDL_EVENTCATEGORY_RENDER:
241 windowID = event->render.windowID;
242 break;
243 default:
244 // < 0 -> invalid event type (error is set by SDL_GetEventCategory)
245 // else -> event has no associated window (not an error)
246 return NULL;
247 }
248 return SDL_GetWindowFromID(windowID);
249}
250