From 280cc83e1cda3f4df5b658057288d809d138f446 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gustaf=20Alh=C3=A4ll?= <gustaf@hanicef.me>
Date: Sun, 13 Oct 2024 17:16:43 +0200
Subject: [PATCH] Use separate event for text input

---
 src/g_game.c       |  2 +-
 src/lua_baselib.c  |  1 +
 src/lua_hook.h     |  1 +
 src/lua_hooklib.c  | 11 +++++++++++
 src/lua_inputlib.c | 23 +++++++++++++++++++++++
 src/lua_libs.h     |  1 +
 6 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/src/g_game.c b/src/g_game.c
index d92db01121..0bc1e85e70 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -2286,7 +2286,7 @@ boolean G_LuaResponder(event_t *ev)
 	}
 	else if (ev->type == ev_text)
 	{
-		cancelled = LUA_HookKey(ev, HOOK(TextInput));
+		cancelled = LUA_HookText(ev, HOOK(TextInput));
 		LUA_InvalidateUserdata(ev);
 	}
 
diff --git a/src/lua_baselib.c b/src/lua_baselib.c
index 19775eb8a2..95ee67e1b7 100644
--- a/src/lua_baselib.c
+++ b/src/lua_baselib.c
@@ -238,6 +238,7 @@ static const struct {
 	{META_LUABANKS,     "luabanks[]"},
 
 	{META_KEYEVENT,     "keyevent_t"},
+	{META_TEXTEVENT,    "textevent_t"},
 	{META_MOUSE,        "mouse_t"},
 	{NULL,              NULL}
 };
diff --git a/src/lua_hook.h b/src/lua_hook.h
index 65dc81ddf2..e49c22438c 100644
--- a/src/lua_hook.h
+++ b/src/lua_hook.h
@@ -135,6 +135,7 @@ void LUA_HookBool(boolean value, int hook);
 int  LUA_HookPlayer(player_t *, int hook);
 int  LUA_HookTiccmd(player_t *, ticcmd_t *, int hook);
 int  LUA_HookKey(event_t *event, int hook); // Hooks for key events
+int  LUA_HookText(event_t *event, int hook); // Hooks for text events
 
 void LUA_HookPreThinkFrame(void);
 void LUA_HookThinkFrame(void);
diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c
index 1bf3caf65f..a39745438d 100644
--- a/src/lua_hooklib.c
+++ b/src/lua_hooklib.c
@@ -690,6 +690,17 @@ int LUA_HookKey(event_t *event, int hook_type)
 	return hook.status;
 }
 
+int LUA_HookText(event_t *event, int hook_type)
+{
+	Hook_State hook;
+	if (prepare_hook(&hook, false, hook_type))
+	{
+		LUA_PushUserdata(gL, event, META_TEXTEVENT);
+		call_hooks(&hook, 1, res_true);
+	}
+	return hook.status;
+}
+
 void LUA_HookHUD(int hook_type, huddrawlist_h list)
 {
 	Hook_State hook;
diff --git a/src/lua_inputlib.c b/src/lua_inputlib.c
index 054ae4cc45..eb9fe7dc55 100644
--- a/src/lua_inputlib.c
+++ b/src/lua_inputlib.c
@@ -234,6 +234,28 @@ static int lib_lenGameKeyDown(lua_State *L)
 	return 1;
 }
 
+////////////////
+// TEXT EVENT //
+////////////////
+
+static int textevent_get(lua_State *L)
+{
+	event_t *event = *((event_t **)luaL_checkudata(L, 1, META_TEXTEVENT));
+	const char *field = luaL_checkstring(L, 2);
+
+	I_Assert(event != NULL);
+
+	if (fastcmp(field,"text"))
+	{
+		char s[2] = { event->key, 0 };
+		lua_pushstring(L, s);
+	}
+	else
+		return luaL_error(L, "textevent_t has no field named %s", field);
+
+	return 1;
+}
+
 ///////////////
 // KEY EVENT //
 ///////////////
@@ -299,6 +321,7 @@ static int mouse_num(lua_State *L)
 
 int LUA_InputLib(lua_State *L)
 {
+	LUA_RegisterUserdataMetatable(L, META_TEXTEVENT, textevent_get, NULL, NULL);
 	LUA_RegisterUserdataMetatable(L, META_KEYEVENT, keyevent_get, NULL, NULL);
 	LUA_RegisterUserdataMetatable(L, META_MOUSE, mouse_get, NULL, mouse_num);
 
diff --git a/src/lua_libs.h b/src/lua_libs.h
index e1585f488a..592f46df56 100644
--- a/src/lua_libs.h
+++ b/src/lua_libs.h
@@ -93,6 +93,7 @@ extern boolean ignoregameinputs;
 
 #define META_LUABANKS "LUABANKS[]*"
 
+#define META_TEXTEVENT "TEXTEVENT_T*"
 #define META_KEYEVENT "KEYEVENT_T*"
 #define META_MOUSE "MOUSE_T*"
 
-- 
GitLab