{
  "$type": "site.standard.document",
  "bskyPostRef": {
    "cid": "bafyreigxlpcgubb5uyksjqx3dfg5dvqyvkom5h6qvonxzxkxzouzjc2znm",
    "uri": "at://did:plc:4n6wgsqsqm6q2hjncgwmreey/app.bsky.feed.post/3mlrvxdzqozt2"
  },
  "path": "/post/50257995",
  "publishedAt": "2026-05-12T09:06:16.000Z",
  "site": "https://programming.dev",
  "tags": [
    "Godot",
    "Fizz",
    "12 comments"
  ],
  "textContent": "submitted by Fizz to godot\n19 points | 12 comments\n\nI am working on the input and it feels like its getting out of hand. I wanted to check in with people and see how people structure their input handling.\n\nCurrently I have 1 function _unhandled_unput(event) and inside there I have a ton of elif statements trying to handle every possible situation and event. Its manageable at the moment but I only have like 4 events so its going to get very out of hand if I continue.\n\nI need to have 100s of these events based on whats selected and what mouse/keyboard buttons are being pressed and I need some way to resuse the actions.\n\nspoiler\n\n`func _unhandled_input(event): if event is InputEventMouseButton and event.pressed: if event.button_index == MOUSE_BUTTON_RIGHT: clear_selection() gui.queue_redraw() get_viewport().set_input_as_handled() return if selected_item == “colonist”: #broken if event is InputEventKey: if event.OS.get_keycode_string() == “r”: for colonist in selected_group: colonist.set_state(“DRAFT”) get_viewport().set_input_as_handled() gui.queue_redraw() #nothing selected dragbox to select things and single click to select things - does not work at the moment elif selected_type == “” or selected_type == “basic”: if is_dragging and event is InputEventMouseMotion: drag_end = camera.get_global_mouse_position() cam_drag_end= get_viewport().get_mouse_position() get_selection(drag_start, drag_end) gui.queue_redraw() get_viewport().set_input_as_handled() return elif event is InputEventMouseButton and not event.pressed: is_dragging = false gui.queue_redraw() drag_start = null drag_end = null get_viewport().set_input_as_handled() return elif event is InputEventMouseButton and event.pressed: if event.button_index == MOUSE_BUTTON_LEFT: selected_type = “basic” is_dragging = true drag_start = camera.get_global_mouse_position() cam_drag_start = get_viewport().get_mouse_position() gui.queue_redraw() get_viewport().set_input_as_handled() return #command flow for dragging a selection box elif selected_type == “command”: if selected_item == “structure_dict_growing”: if is_dragging and event is InputEventMouseMotion: var grid_pos = tilemap.local_to_map(camera.get_global_mouse_position()) var local_pos = tilemap.map_to_local(grid_pos) drag_end = local_pos + Vector2(32, 32) cam_drag_end = get_viewport().get_mouse_position() gui.queue_redraw() get_viewport().set_input_as_handled() return elif event is InputEventMouseButton and not event.pressed: if event.button_index == MOUSE_BUTTON_LEFT: is_dragging = false gui.queue_redraw() get_viewport().set_input_as_handled() MessageBus.rpc_id(1, “request_zone_growing”, selected_item ,drag_start, drag_end, multiplayer.get_unique_id()) drag_start = null drag_end = null return elif event is InputEventMouseButton and event.pressed: if event.button_index == MOUSE_BUTTON_LEFT: is_dragging = true #to snap to grid var grid_pos = tilemap.local_to_map(camera.get_global_mouse_position()) var local_pos = tilemap.map_to_local(grid_pos) drag_start = local_pos - Vector2(32, 32) cam_drag_start = get_viewport().get_mouse_position() #this is broken cbf fixing maybe one day after selection is working gui.queue_redraw() get_viewport().set_input_as_handled() return elif selected_type == “floor”: if event is InputEventMouseButton and event.pressed: if event.button_index == MOUSE_BUTTON_LEFT: var global_mouse_pos = camera.get_global_mouse_position() var grid_pos = tilemap.local_to_map(global_mouse_pos) if selected_item == “”: return MessageBus.rpc_id(1, “request_build_floor”, selected_item, grid_pos, multiplayer.get_unique_id()) get_viewport().set_input_as_handled() return elif selected_type == “building”: if event is InputEventMouseButton and event.pressed: if event.button_index == MOUSE_BUTTON_LEFT: var global_mouse_pos = camera.get_global_mouse_position() var grid_pos = tilemap.local_to_map(global_mouse_pos) if selected_item == “”: return MessageBus.rpc_id(1, “request_build_structure”, selected_item, grid_pos, multiplayer.get_unique_id()) get_viewport().set_input_as_handled() return`",
  "title": "How do people handle keyboard and mouse Input?"
}