From 6a72d32d410b78b190828b6690ce817f81e8f677 Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
Date: Sat, 18 Jan 2025 08:43:55 -0500
Subject: [PATCH] emscripten: Let SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT accept
"".
This is used to say "don't even try to listen for keypresses," for apps that
are managing this outside of SDL.
Fixes #10292.
---
include/SDL3/SDL_hints.h | 1 +
src/video/emscripten/SDL_emscriptenevents.c | 16 ++++++++++------
2 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/include/SDL3/SDL_hints.h b/include/SDL3/SDL_hints.h
index a33b8174c3ef2..7a2938efe8ce5 100644
--- a/include/SDL3/SDL_hints.h
+++ b/include/SDL3/SDL_hints.h
@@ -730,6 +730,7 @@ extern "C" {
* - "#document": the javascript document object
* - "#screen": the javascript window.screen object
* - "#canvas": the WebGL canvas element
+ * - "": Don't bind anything at all
* - any other string without a leading # sign applies to the element on the
* page with that ID.
*
diff --git a/src/video/emscripten/SDL_emscriptenevents.c b/src/video/emscripten/SDL_emscriptenevents.c
index c9437a9412a45..5f2b6bf8d5a8f 100644
--- a/src/video/emscripten/SDL_emscriptenevents.c
+++ b/src/video/emscripten/SDL_emscriptenevents.c
@@ -1033,9 +1033,11 @@ void Emscripten_RegisterEventHandlers(SDL_WindowData *data)
keyElement = EMSCRIPTEN_EVENT_TARGET_WINDOW;
}
- emscripten_set_keydown_callback(keyElement, data, 0, Emscripten_HandleKey);
- emscripten_set_keyup_callback(keyElement, data, 0, Emscripten_HandleKey);
- emscripten_set_keypress_callback(keyElement, data, 0, Emscripten_HandleKeyPress);
+ if (*keyElement) {
+ emscripten_set_keydown_callback(keyElement, data, 0, Emscripten_HandleKey);
+ emscripten_set_keyup_callback(keyElement, data, 0, Emscripten_HandleKey);
+ emscripten_set_keypress_callback(keyElement, data, 0, Emscripten_HandleKeyPress);
+ }
emscripten_set_fullscreenchange_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, data, 0, Emscripten_HandleFullscreenChange);
@@ -1092,9 +1094,11 @@ void Emscripten_UnregisterEventHandlers(SDL_WindowData *data)
target = EMSCRIPTEN_EVENT_TARGET_WINDOW;
}
- emscripten_set_keydown_callback(target, NULL, 0, NULL);
- emscripten_set_keyup_callback(target, NULL, 0, NULL);
- emscripten_set_keypress_callback(target, NULL, 0, NULL);
+ if (*target) {
+ emscripten_set_keydown_callback(target, NULL, 0, NULL);
+ emscripten_set_keyup_callback(target, NULL, 0, NULL);
+ emscripten_set_keypress_callback(target, NULL, 0, NULL);
+ }
emscripten_set_fullscreenchange_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, NULL, 0, NULL);