Fixed memory leak cleaning up mouse and keyboard instances

Fixes https://github.com/libsdl-org/SDL/issues/9487
This commit is contained in:
Sam Lantinga 2024-05-07 09:13:50 -07:00
parent 53a45a4437
commit 537c62f4c1
9 changed files with 34 additions and 26 deletions

View file

@ -619,7 +619,7 @@ static int SDL_EVDEV_init_keyboard(SDL_evdevlist_item *item, int udev_class)
static void SDL_EVDEV_destroy_keyboard(SDL_evdevlist_item *item) static void SDL_EVDEV_destroy_keyboard(SDL_evdevlist_item *item)
{ {
SDL_RemoveKeyboard((SDL_KeyboardID)item->fd); SDL_RemoveKeyboard((SDL_KeyboardID)item->fd, SDL_TRUE);
} }
static int SDL_EVDEV_init_mouse(SDL_evdevlist_item *item, int udev_class) static int SDL_EVDEV_init_mouse(SDL_evdevlist_item *item, int udev_class)
@ -656,7 +656,7 @@ static int SDL_EVDEV_init_mouse(SDL_evdevlist_item *item, int udev_class)
static void SDL_EVDEV_destroy_mouse(SDL_evdevlist_item *item) static void SDL_EVDEV_destroy_mouse(SDL_evdevlist_item *item)
{ {
SDL_RemoveMouse((SDL_MouseID)item->fd); SDL_RemoveMouse((SDL_MouseID)item->fd, SDL_TRUE);
} }
static int SDL_EVDEV_init_touchscreen(SDL_evdevlist_item *item, int udev_class) static int SDL_EVDEV_init_touchscreen(SDL_evdevlist_item *item, int udev_class)

View file

@ -734,7 +734,7 @@ void SDL_AddKeyboard(SDL_KeyboardID keyboardID, const char *name, SDL_bool send_
} }
} }
void SDL_RemoveKeyboard(SDL_KeyboardID keyboardID) void SDL_RemoveKeyboard(SDL_KeyboardID keyboardID, SDL_bool send_event)
{ {
int keyboard_index = SDL_GetKeyboardIndex(keyboardID); int keyboard_index = SDL_GetKeyboardIndex(keyboardID);
if (keyboard_index < 0) { if (keyboard_index < 0) {
@ -749,11 +749,13 @@ void SDL_RemoveKeyboard(SDL_KeyboardID keyboardID)
} }
--SDL_keyboard_count; --SDL_keyboard_count;
SDL_Event event; if (send_event) {
SDL_zero(event); SDL_Event event;
event.type = SDL_EVENT_KEYBOARD_REMOVED; SDL_zero(event);
event.kdevice.which = keyboardID; event.type = SDL_EVENT_KEYBOARD_REMOVED;
SDL_PushEvent(&event); event.kdevice.which = keyboardID;
SDL_PushEvent(&event);
}
} }
SDL_bool SDL_HasKeyboard(void) SDL_bool SDL_HasKeyboard(void)
@ -1254,7 +1256,9 @@ int SDL_SendEditingText(const char *text, int start, int length)
void SDL_QuitKeyboard(void) void SDL_QuitKeyboard(void)
{ {
SDL_keyboard_count = 0; for (int i = SDL_keyboard_count; i--;) {
SDL_RemoveKeyboard(SDL_keyboards[i].instance_id, SDL_FALSE);
}
SDL_free(SDL_keyboards); SDL_free(SDL_keyboards);
SDL_keyboards = NULL; SDL_keyboards = NULL;
} }

View file

@ -39,7 +39,7 @@ extern SDL_bool SDL_IsKeyboard(Uint16 vendor, Uint16 product, int num_keys);
extern void SDL_AddKeyboard(SDL_KeyboardID keyboardID, const char *name, SDL_bool send_event); extern void SDL_AddKeyboard(SDL_KeyboardID keyboardID, const char *name, SDL_bool send_event);
/* A keyboard has been removed from the system */ /* A keyboard has been removed from the system */
extern void SDL_RemoveKeyboard(SDL_KeyboardID keyboardID); extern void SDL_RemoveKeyboard(SDL_KeyboardID keyboardID, SDL_bool send_event);
/* Get the default keymap */ /* Get the default keymap */
extern void SDL_GetDefaultKeymap(SDL_Keycode *keymap); extern void SDL_GetDefaultKeymap(SDL_Keycode *keymap);

View file

@ -280,7 +280,7 @@ void SDL_AddMouse(SDL_MouseID mouseID, const char *name, SDL_bool send_event)
} }
} }
void SDL_RemoveMouse(SDL_MouseID mouseID) void SDL_RemoveMouse(SDL_MouseID mouseID, SDL_bool send_event)
{ {
int mouse_index = SDL_GetMouseIndex(mouseID); int mouse_index = SDL_GetMouseIndex(mouseID);
if (mouse_index < 0) { if (mouse_index < 0) {
@ -308,11 +308,13 @@ void SDL_RemoveMouse(SDL_MouseID mouseID)
} }
} }
SDL_Event event; if (send_event) {
SDL_zero(event); SDL_Event event;
event.type = SDL_EVENT_MOUSE_REMOVED; SDL_zero(event);
event.mdevice.which = mouseID; event.type = SDL_EVENT_MOUSE_REMOVED;
SDL_PushEvent(&event); event.mdevice.which = mouseID;
SDL_PushEvent(&event);
}
} }
SDL_bool SDL_HasMouse(void) SDL_bool SDL_HasMouse(void)
@ -1118,7 +1120,9 @@ void SDL_QuitMouse(void)
SDL_DelHintCallback(SDL_HINT_MOUSE_RELATIVE_WARP_MOTION, SDL_DelHintCallback(SDL_HINT_MOUSE_RELATIVE_WARP_MOTION,
SDL_MouseRelativeWarpMotionChanged, mouse); SDL_MouseRelativeWarpMotionChanged, mouse);
SDL_mouse_count = 0; for (int i = SDL_mouse_count; i--; ) {
SDL_RemoveMouse(SDL_mice[i].instance_id, SDL_FALSE);
}
SDL_free(SDL_mice); SDL_free(SDL_mice);
SDL_mice = NULL; SDL_mice = NULL;
} }

View file

@ -140,7 +140,7 @@ extern SDL_bool SDL_IsMouse(Uint16 vendor, Uint16 product);
extern void SDL_AddMouse(SDL_MouseID mouseID, const char *name, SDL_bool send_event); extern void SDL_AddMouse(SDL_MouseID mouseID, const char *name, SDL_bool send_event);
/* A mouse has been removed from the system */ /* A mouse has been removed from the system */
extern void SDL_RemoveMouse(SDL_MouseID mouseID); extern void SDL_RemoveMouse(SDL_MouseID mouseID, SDL_bool send_event);
/* Get the mouse state structure */ /* Get the mouse state structure */
extern SDL_Mouse *SDL_GetMouse(void); extern SDL_Mouse *SDL_GetMouse(void);

View file

@ -193,7 +193,7 @@ static void OnGCKeyboardDisconnected(GCKeyboard *keyboard) API_AVAILABLE(macos(1
{ {
SDL_KeyboardID keyboardID = (SDL_KeyboardID)(uintptr_t)keyboard; SDL_KeyboardID keyboardID = (SDL_KeyboardID)(uintptr_t)keyboard;
SDL_RemoveKeyboard(keyboardID); SDL_RemoveKeyboard(keyboardID, SDL_TRUE);
keyboard.keyboardInput.keyChangedHandler = nil; keyboard.keyboardInput.keyChangedHandler = nil;
} }
@ -385,7 +385,7 @@ static void OnGCMouseDisconnected(GCMouse *mouse) API_AVAILABLE(macos(11.0), ios
UpdatePointerLock(); UpdatePointerLock();
SDL_RemoveMouse(mouseID); SDL_RemoveMouse(mouseID, SDL_TRUE);
} }
void SDL_InitGCMouse(void) void SDL_InitGCMouse(void)

View file

@ -1732,7 +1732,7 @@ static void seat_handle_capabilities(void *data, struct wl_seat *seat,
input->pointer = NULL; input->pointer = NULL;
input->display->pointer = NULL; input->display->pointer = NULL;
SDL_RemoveMouse(input->pointer_id); SDL_RemoveMouse(input->pointer_id, SDL_TRUE);
input->pointer_id = 0; input->pointer_id = 0;
} }
@ -1760,7 +1760,7 @@ static void seat_handle_capabilities(void *data, struct wl_seat *seat,
wl_keyboard_destroy(input->keyboard); wl_keyboard_destroy(input->keyboard);
input->keyboard = NULL; input->keyboard = NULL;
SDL_RemoveKeyboard(input->keyboard_id); SDL_RemoveKeyboard(input->keyboard_id, SDL_TRUE);
input->keyboard_id = 0; input->keyboard_id = 0;
} }

View file

@ -926,13 +926,13 @@ void WIN_CheckKeyboardAndMouseHotplug(SDL_VideoDevice *_this, SDL_bool initial_c
for (int i = old_keyboard_count; i--;) { for (int i = old_keyboard_count; i--;) {
if (!HasDeviceID(old_keyboards[i], new_keyboards, new_keyboard_count)) { if (!HasDeviceID(old_keyboards[i], new_keyboards, new_keyboard_count)) {
SDL_RemoveKeyboard(old_keyboards[i]); SDL_RemoveKeyboard(old_keyboards[i], send_event);
} }
} }
for (int i = old_mouse_count; i--;) { for (int i = old_mouse_count; i--;) {
if (!HasDeviceID(old_mice[i], new_mice, new_mouse_count)) { if (!HasDeviceID(old_mice[i], new_mice, new_mouse_count)) {
SDL_RemoveMouse(old_mice[i]); SDL_RemoveMouse(old_mice[i], send_event);
} }
} }

View file

@ -823,13 +823,13 @@ void X11_Xinput2UpdateDevices(SDL_VideoDevice *_this, SDL_bool initial_check)
for (int i = old_keyboard_count; i--;) { for (int i = old_keyboard_count; i--;) {
if (!HasDeviceID(old_keyboards[i], new_keyboards, new_keyboard_count)) { if (!HasDeviceID(old_keyboards[i], new_keyboards, new_keyboard_count)) {
SDL_RemoveKeyboard(old_keyboards[i]); SDL_RemoveKeyboard(old_keyboards[i], send_event);
} }
} }
for (int i = old_mouse_count; i--;) { for (int i = old_mouse_count; i--;) {
if (!HasDeviceID(old_mice[i], new_mice, new_mouse_count)) { if (!HasDeviceID(old_mice[i], new_mice, new_mouse_count)) {
SDL_RemoveMouse(old_mice[i]); SDL_RemoveMouse(old_mice[i], send_event);
} }
} }