MagickPanda
I wouldn't know about any "proper" way. Without seeing exactly what you are up to its hard to give adequate opinion.
In my project I have an input handling script. But it isn't a singleton. It is instantiated in every scene wherein user input is needed.
Maybe the approach of having singletons handle all aspects is the mistake in your refactoring.
Here is my input handler (albeit not 100% complete).
extends Node2D
class_name InputHandler
signal mouse_button_left_released(event:Variant)
signal mouse_button_left_double_click(event:Variant)
signal escape_pressed
signal enter_pressed
signal left_pressed
signal tab_pressed
signal right_pressed
signal up_pressed
signal down_pressed
signal backspace_pressed
signal space_pressed
signal key_pressed(key:Variant)
func _ready():
handle_inputs_stop()
func handle_inputs_start()->void:
set_process_input(true)
func handle_inputs_stop()->void:
set_process_input(false)
func _validate_key_press(event)->Variant:
if event is InputEventKey:
if event.is_pressed() == true:
if event.shift_pressed:
if event.is_echo() == false:
return [event.keycode, true]
if event.is_echo() == false:
return [event.keycode, false]
return [0, false]
func _handle_mouse_button(event):
if event.is_double_click():
emit_signal("mouse_button_left_double_click", event)
else:
if event.is_action_released("MouseButtonLeft"):
emit_signal("mouse_button_left_released", event)
func _input(event):
if event is InputEventMouseButton:
_handle_mouse_button(event)
return
var key = _validate_key_press(event)
if key[0] != 0:
match key[0]:
KEY_ESCAPE:
emit_signal("escape_pressed")
KEY_LEFT:
emit_signal("left_pressed")
KEY_RIGHT:
emit_signal("right_pressed")
KEY_UP:
emit_signal("up_pressed")
KEY_DOWN:
emit_signal("down_pressed")
KEY_TAB:
emit_signal("tab_pressed")
KEY_BACKSPACE:
emit_signal("backspace_pressed")
KEY_SPACE:
emit_signal("space_pressed")
KEY_ENTER, KEY_KP_ENTER:
emit_signal("enter_pressed")
_:
var c := char(event.unicode)
var ascii:int = c.unicode_at(0)
emit_signal("key_pressed", ascii)
In any scene that needs user input I just plop it in as inherited child scene and:
@onready var _ih = $InputHandler
and respond to the signals I need for that scenes UI.