From 46f87cdc5a59aa14142c15fde8745bac2de65f28 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 28 Apr 2026 21:52:21 -0500 Subject: [PATCH] pen: Only create touch emulation device when a pen is present (cherry picked from commit 1aa72247af95802d897dabd51b29311e87c41ae0) --- src/events/SDL_mouse.c | 13 +++---------- src/events/SDL_pen.c | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/events/SDL_mouse.c b/src/events/SDL_mouse.c index 80bd6495f2..e389e47a16 100644 --- a/src/events/SDL_mouse.c +++ b/src/events/SDL_mouse.c @@ -194,16 +194,9 @@ static void SDLCALL SDL_PenTouchEventsChanged(void *userdata, const char *name, mouse->pen_touch_events = SDL_GetStringBoolean(hint, true); - if (mouse->pen_touch_events) { - if (!mouse->added_pen_touch_device) { - SDL_AddTouch(SDL_PEN_TOUCHID, SDL_TOUCH_DEVICE_DIRECT, "pen_input"); - mouse->added_pen_touch_device = true; - } - } else { - if (mouse->added_pen_touch_device) { - SDL_DelTouch(SDL_PEN_TOUCHID); - mouse->added_pen_touch_device = false; - } + if (!mouse->pen_touch_events && mouse->added_pen_touch_device) { + SDL_DelTouch(SDL_PEN_TOUCHID); + mouse->added_pen_touch_device = false; } } diff --git a/src/events/SDL_pen.c b/src/events/SDL_pen.c index 61d41e1fea..83543a695e 100644 --- a/src/events/SDL_pen.c +++ b/src/events/SDL_pen.c @@ -228,6 +228,7 @@ SDL_PenID SDL_AddPenDevice(Uint64 timestamp, const char *name, SDL_Window *windo SDL_LockRWLockForWriting(pen_device_rwlock); + bool first_device = false; SDL_Pen *pen = NULL; void *ptr = SDL_realloc(pen_devices, (pen_device_count + 1) * sizeof (*pen)); if (ptr) { @@ -236,6 +237,8 @@ SDL_PenID SDL_AddPenDevice(Uint64 timestamp, const char *name, SDL_Window *windo pen = &pen_devices[pen_device_count]; pen_device_count++; + first_device = (pen_device_count == 1); + SDL_zerop(pen); pen->instance_id = result; pen->name = namecpy; @@ -251,6 +254,14 @@ SDL_PenID SDL_AddPenDevice(Uint64 timestamp, const char *name, SDL_Window *windo SDL_free(namecpy); } + if (first_device) { + SDL_Mouse *mouse = SDL_GetMouse(); + if (mouse->pen_touch_events && !mouse->added_pen_touch_device) { + SDL_AddTouch(SDL_PEN_TOUCHID, SDL_TOUCH_DEVICE_DIRECT, "pen_input"); + mouse->added_pen_touch_device = true; + } + } + if (result && in_proximity) { SDL_SendPenProximity(timestamp, result, window, true, true); } @@ -267,6 +278,7 @@ void SDL_RemovePenDevice(Uint64 timestamp, SDL_Window *window, SDL_PenID instanc SDL_SendPenProximity(timestamp, instance_id, window, false, true); // bye bye SDL_LockRWLockForWriting(pen_device_rwlock); + bool last_device = false; SDL_Pen *pen = FindPenByInstanceId(instance_id); if (pen) { SDL_free(pen->name); @@ -288,9 +300,18 @@ void SDL_RemovePenDevice(Uint64 timestamp, SDL_Window *window, SDL_PenID instanc } else { SDL_free(pen_devices); pen_devices = NULL; + last_device = true; } } SDL_UnlockRWLock(pen_device_rwlock); + + if (last_device) { + SDL_Mouse *mouse = SDL_GetMouse(); + if (mouse->added_pen_touch_device) { + SDL_DelTouch(SDL_PEN_TOUCHID); + mouse->added_pen_touch_device = false; + } + } } // This presumably is happening during video quit, so we don't send PROXIMITY_OUT events here.