Browse Source

Fix Enter key after creating a new world (#12997)

Prevents Enter key or "double-click" event to play the world just after creating a new world
Muhammad Rifqi Priyo Susanto 1 year ago
parent
commit
a2a280691c
2 changed files with 17 additions and 0 deletions
  1. 6 0
      builtin/mainmenu/dlg_create_world.lua
  2. 11 0
      builtin/mainmenu/tab_local.lua

+ 6 - 0
builtin/mainmenu/dlg_create_world.lua

@@ -352,6 +352,12 @@ local function create_world_buttonhandler(this, fields)
 	if fields["world_create_confirm"] or
 		fields["key_enter"] then
 
+		if fields["key_enter"] then
+			-- HACK: This timestamp prevents double-triggering when pressing Enter on an input box
+			-- and releasing it on a button[] or textlist[] due to instant formspec updates.
+			this.parent.dlg_create_world_closed_at = core.get_us_time()
+		end
+
 		local worldname = fields["te_world_name"]
 		local game, _ = pkgmgr.find_by_gameid(core.settings:get("menu_last_game"))
 

+ 11 - 0
builtin/mainmenu/tab_local.lua

@@ -215,6 +215,10 @@ local function main_button_handler(this, fields, name, tabdata)
 
 	assert(name == "local")
 
+	if this.dlg_create_world_closed_at == nil then
+		this.dlg_create_world_closed_at = 0
+	end
+
 	local world_doubleclick = false
 
 	if fields["sp_worlds"] ~= nil then
@@ -269,6 +273,12 @@ local function main_button_handler(this, fields, name, tabdata)
 	end
 
 	if fields["play"] ~= nil or world_doubleclick or fields["key_enter"] then
+		local enter_key_duration = core.get_us_time() - this.dlg_create_world_closed_at
+		if world_doubleclick and enter_key_duration <= 200000 then -- 200 ms
+			this.dlg_create_world_closed_at = 0
+			return true
+		end
+
 		local selected = core.get_textlist_index("sp_worlds")
 		gamedata.selected_world = menudata.worldlist:get_raw_index(selected)
 
@@ -316,6 +326,7 @@ local function main_button_handler(this, fields, name, tabdata)
 	end
 
 	if fields["world_create"] ~= nil then
+		this.dlg_create_world_closed_at = 0
 		local create_world_dlg = create_create_world_dlg()
 		create_world_dlg:set_parent(this)
 		this:hide()