Browse Source

Entirely removes BIND_VMETHOD in favor of GDVIRTUAL

* `_gui_input`, `_input`, `_unhandled_input` and `_unhandled_key_input` are now regular C++ virutal functions.
* Everything else converted to GDVIRTUAL
* BIND_VMETHOD is gone, always use the new syntax from now on.

Creating `_gui_input` method and using the binder to register events will no longer work, simply override the virtual function now.
reduz 4 năm trước cách đây
mục cha
commit
5cecdfa8af
100 tập tin đã thay đổi với 215 bổ sung283 xóa
  1. 8 1
      core/input/input_event.cpp
  2. 3 0
      core/input/input_event.h
  3. 0 0
      core/input/shortcut.cpp
  4. 0 0
      core/input/shortcut.h
  5. 0 11
      core/object/class_db.h
  6. 3 0
      core/register_core_types.cpp
  7. 1 1
      doc/classes/CollisionObject2D.xml
  8. 1 1
      doc/classes/CollisionObject3D.xml
  9. 1 1
      doc/classes/GraphEdit.xml
  10. 17 0
      doc/classes/InputEventShortcut.xml
  11. 2 10
      doc/classes/Node.xml
  12. 16 16
      doc/classes/Viewport.xml
  13. 1 3
      editor/animation_bezier_editor.cpp
  14. 1 1
      editor/animation_bezier_editor.h
  15. 3 7
      editor/animation_track_editor.cpp
  16. 2 2
      editor/animation_track_editor.h
  17. 2 2
      editor/animation_track_editor_plugins.cpp
  18. 1 1
      editor/animation_track_editor_plugins.h
  19. 2 5
      editor/code_editor.cpp
  20. 2 2
      editor/code_editor.h
  21. 1 1
      editor/create_dialog.cpp
  22. 2 2
      editor/editor_audio_buses.cpp
  23. 1 1
      editor/editor_audio_buses.h
  24. 3 3
      editor/editor_command_palette.cpp
  25. 1 1
      editor/editor_command_palette.h
  26. 1 3
      editor/editor_file_dialog.cpp
  27. 1 1
      editor/editor_file_dialog.h
  28. 1 3
      editor/editor_help.cpp
  29. 1 1
      editor/editor_help.h
  30. 1 1
      editor/editor_help_search.cpp
  31. 2 5
      editor/editor_inspector.cpp
  32. 2 2
      editor/editor_inspector.h
  33. 1 2
      editor/editor_node.cpp
  34. 1 1
      editor/editor_node.h
  35. 1 2
      editor/editor_properties.cpp
  36. 1 1
      editor/editor_settings.h
  37. 1 3
      editor/editor_spin_slider.cpp
  38. 1 1
      editor/editor_spin_slider.h
  39. 1 2
      editor/plugins/animation_player_editor_plugin.cpp
  40. 1 1
      editor/plugins/animation_player_editor_plugin.h
  41. 1 3
      editor/plugins/asset_library_editor_plugin.cpp
  42. 1 1
      editor/plugins/asset_library_editor_plugin.h
  43. 2 2
      editor/plugins/canvas_item_editor_plugin.cpp
  44. 1 1
      editor/plugins/canvas_item_editor_plugin.h
  45. 1 5
      editor/plugins/curve_editor_plugin.cpp
  46. 1 3
      editor/plugins/curve_editor_plugin.h
  47. 1 5
      editor/plugins/mesh_editor_plugin.cpp
  48. 1 2
      editor/plugins/mesh_editor_plugin.h
  49. 3 12
      editor/plugins/node_3d_editor_plugin.cpp
  50. 3 5
      editor/plugins/node_3d_editor_plugin.h
  51. 0 4
      editor/plugins/resource_preloader_editor_plugin.cpp
  52. 1 1
      editor/plugins/resource_preloader_editor_plugin.h
  53. 3 3
      editor/plugins/script_editor_plugin.cpp
  54. 1 1
      editor/plugins/script_editor_plugin.h
  55. 1 1
      editor/plugins/sprite_frames_editor_plugin.cpp
  56. 1 1
      editor/plugins/sprite_frames_editor_plugin.h
  57. 0 4
      editor/plugins/texture_3d_editor_plugin.cpp
  58. 0 1
      editor/plugins/texture_3d_editor_plugin.h
  59. 1 2
      editor/plugins/texture_layered_editor_plugin.cpp
  60. 1 1
      editor/plugins/texture_layered_editor_plugin.h
  61. 2 4
      editor/plugins/tiles/tile_atlas_view.cpp
  62. 1 1
      editor/plugins/tiles/tile_atlas_view.h
  63. 1 1
      editor/plugins/visual_shader_editor_plugin.cpp
  64. 1 2
      editor/project_manager.cpp
  65. 1 1
      editor/project_manager.h
  66. 1 1
      editor/property_selector.cpp
  67. 1 1
      editor/quick_open.cpp
  68. 3 4
      editor/scene_tree_dock.cpp
  69. 2 2
      editor/scene_tree_dock.h
  70. 1 2
      editor/settings_config_dialog.cpp
  71. 1 1
      editor/settings_config_dialog.h
  72. 1 1
      modules/gridmap/grid_map_editor_plugin.cpp
  73. 0 20
      modules/visual_script/visual_script.cpp
  74. 1 3
      modules/visual_script/visual_script_editor.cpp
  75. 1 1
      modules/visual_script/visual_script_editor.h
  76. 1 1
      modules/visual_script/visual_script_property_selector.cpp
  77. 3 5
      scene/2d/collision_object_2d.cpp
  78. 3 1
      scene/2d/collision_object_2d.h
  79. 3 5
      scene/2d/touch_screen_button.cpp
  80. 1 1
      scene/2d/touch_screen_button.h
  81. 3 5
      scene/3d/collision_object_3d.cpp
  82. 3 1
      scene/3d/collision_object_3d.h
  83. 2 4
      scene/gui/base_button.cpp
  84. 2 2
      scene/gui/base_button.h
  85. 3 3
      scene/gui/code_edit.cpp
  86. 1 1
      scene/gui/code_edit.h
  87. 20 6
      scene/gui/control.cpp
  88. 16 12
      scene/gui/control.h
  89. 1 3
      scene/gui/file_dialog.cpp
  90. 1 1
      scene/gui/file_dialog.h
  91. 1 2
      scene/gui/gradient_edit.cpp
  92. 1 1
      scene/gui/gradient_edit.h
  93. 6 10
      scene/gui/graph_edit.cpp
  94. 4 4
      scene/gui/graph_edit.h
  95. 1 3
      scene/gui/graph_node.cpp
  96. 1 1
      scene/gui/graph_node.h
  97. 1 3
      scene/gui/item_list.cpp
  98. 2 1
      scene/gui/item_list.h
  99. 1 2
      scene/gui/line_edit.cpp
  100. 1 1
      scene/gui/line_edit.h

+ 8 - 1
core/input/input_event.cpp

@@ -31,8 +31,8 @@
 #include "input_event.h"
 
 #include "core/input/input_map.h"
+#include "core/input/shortcut.h"
 #include "core/os/keyboard.h"
-#include "scene/gui/shortcut.h"
 
 const int InputEvent::DEVICE_ID_TOUCH_MOUSE = -1;
 const int InputEvent::DEVICE_ID_INTERNAL = -2;
@@ -1545,6 +1545,13 @@ Ref<Shortcut> InputEventShortcut::get_shortcut() {
 	return shortcut;
 }
 
+void InputEventShortcut::_bind_methods() {
+	ClassDB::bind_method(D_METHOD("set_shortcut", "shortcut"), &InputEventShortcut::set_shortcut);
+	ClassDB::bind_method(D_METHOD("get_shortcut"), &InputEventShortcut::get_shortcut);
+
+	ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "shortcut", PROPERTY_HINT_RESOURCE_TYPE, "Shortcut"), "set_shortcut", "get_shortcut");
+}
+
 bool InputEventShortcut::is_pressed() const {
 	return true;
 }

+ 3 - 0
core/input/input_event.h

@@ -548,6 +548,9 @@ class InputEventShortcut : public InputEvent {
 
 	Ref<Shortcut> shortcut;
 
+protected:
+	static void _bind_methods();
+
 public:
 	void set_shortcut(Ref<Shortcut> p_shortcut);
 	Ref<Shortcut> get_shortcut();

+ 0 - 0
scene/gui/shortcut.cpp → core/input/shortcut.cpp


+ 0 - 0
scene/gui/shortcut.h → core/input/shortcut.h


+ 0 - 11
core/object/class_db.h

@@ -425,17 +425,6 @@ public:
 
 #endif
 
-#ifdef TOOLS_ENABLED
-
-#define BIND_VMETHOD(m_method) \
-	::ClassDB::add_virtual_method(get_class_static(), m_method);
-
-#else
-
-#define BIND_VMETHOD(m_method)
-
-#endif
-
 #define GDREGISTER_CLASS(m_class)                    \
 	if (!GD_IS_DEFINED(ClassDB_Disable_##m_class)) { \
 		::ClassDB::register_class<m_class>();        \

+ 3 - 0
core/register_core_types.cpp

@@ -41,6 +41,7 @@
 #include "core/extension/native_extension_manager.h"
 #include "core/input/input.h"
 #include "core/input/input_map.h"
+#include "core/input/shortcut.h"
 #include "core/io/config_file.h"
 #include "core/io/dtls_server.h"
 #include "core/io/http_client.h"
@@ -145,10 +146,12 @@ void register_core_types() {
 	GDREGISTER_CLASS(Resource);
 	GDREGISTER_CLASS(Image);
 
+	GDREGISTER_CLASS(Shortcut);
 	GDREGISTER_VIRTUAL_CLASS(InputEvent);
 	GDREGISTER_VIRTUAL_CLASS(InputEventWithModifiers);
 	GDREGISTER_VIRTUAL_CLASS(InputEventFromWindow);
 	GDREGISTER_CLASS(InputEventKey);
+	GDREGISTER_CLASS(InputEventShortcut);
 	GDREGISTER_VIRTUAL_CLASS(InputEventMouse);
 	GDREGISTER_CLASS(InputEventMouseButton);
 	GDREGISTER_CLASS(InputEventMouseMotion);

+ 1 - 1
doc/classes/CollisionObject2D.xml

@@ -11,7 +11,7 @@
 	<methods>
 		<method name="_input_event" qualifiers="virtual">
 			<return type="void" />
-			<argument index="0" name="viewport" type="Object" />
+			<argument index="0" name="viewport" type="Viewport" />
 			<argument index="1" name="event" type="InputEvent" />
 			<argument index="2" name="shape_idx" type="int" />
 			<description>

+ 1 - 1
doc/classes/CollisionObject3D.xml

@@ -11,7 +11,7 @@
 	<methods>
 		<method name="_input_event" qualifiers="virtual">
 			<return type="void" />
-			<argument index="0" name="camera" type="Object" />
+			<argument index="0" name="camera" type="Camera3D" />
 			<argument index="1" name="event" type="InputEvent" />
 			<argument index="2" name="position" type="Vector3" />
 			<argument index="3" name="normal" type="Vector3" />

+ 1 - 1
doc/classes/GraphEdit.xml

@@ -10,7 +10,7 @@
 	<tutorials>
 	</tutorials>
 	<methods>
-		<method name="_get_connection_line" qualifiers="virtual">
+		<method name="_get_connection_line" qualifiers="virtual const">
 			<return type="PackedVector2Array" />
 			<argument index="0" name="from" type="Vector2" />
 			<argument index="1" name="to" type="Vector2" />

+ 17 - 0
doc/classes/InputEventShortcut.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="InputEventShortcut" inherits="InputEvent" version="4.0">
+	<brief_description>
+	</brief_description>
+	<description>
+	</description>
+	<tutorials>
+	</tutorials>
+	<methods>
+	</methods>
+	<members>
+		<member name="shortcut" type="Shortcut" setter="set_shortcut" getter="get_shortcut">
+		</member>
+	</members>
+	<constants>
+	</constants>
+</class>

+ 2 - 10
doc/classes/Node.xml

@@ -43,14 +43,6 @@
 				Call [method update_configuration_warnings] when the warnings need to be updated for this node.
 			</description>
 		</method>
-		<method name="_get_configuration_warnings" qualifiers="virtual">
-			<return type="String[]" />
-			<description>
-				The elements in the array returned from this method are displayed as warnings in the Scene Dock if the script that overrides it is a [code]tool[/code] script.
-				Returning an empty array produces no warnings.
-				Call [method update_configuration_warnings] when the warnings need to be updated for this node.
-			</description>
-		</method>
 		<method name="_input" qualifiers="virtual">
 			<return type="void" />
 			<argument index="0" name="event" type="InputEvent" />
@@ -104,9 +96,9 @@
 		</method>
 		<method name="_unhandled_key_input" qualifiers="virtual">
 			<return type="void" />
-			<argument index="0" name="event" type="InputEventKey" />
+			<argument index="0" name="event" type="InputEvent" />
 			<description>
-				Called when an [InputEventKey] hasn't been consumed by [method _input] or any GUI. The input event propagates up through the node tree until a node consumes it.
+				Called when an [InputEventKey] or [InputEventShortcut] hasn't been consumed by [method _input] or any GUI. The input event propagates up through the node tree until a node consumes it.
 				It is only called if unhandled key input processing is enabled, which is done automatically if this method is overridden, and can be toggled with [method set_process_unhandled_key_input].
 				To consume the input event and stop it propagating further to other nodes, [method Viewport.set_input_as_handled] can be called.
 				For gameplay input, this and [method _unhandled_input] are usually a better fit than [method _input] as they allow the GUI to intercept the events first.

+ 16 - 16
doc/classes/Viewport.xml

@@ -113,26 +113,33 @@
 				Returns [code]true[/code] if the viewport is currently performing a drag operation.
 			</description>
 		</method>
-		<method name="input">
+		<method name="is_embedding_subwindows" qualifiers="const">
+			<return type="bool" />
+			<description>
+			</description>
+		</method>
+		<method name="is_input_handled" qualifiers="const">
+			<return type="bool" />
+			<description>
+			</description>
+		</method>
+		<method name="push_input">
 			<return type="void" />
 			<argument index="0" name="event" type="InputEvent" />
 			<argument index="1" name="in_local_coords" type="bool" default="false" />
 			<description>
 			</description>
 		</method>
-		<method name="input_text">
+		<method name="push_text_input">
 			<return type="void" />
 			<argument index="0" name="text" type="String" />
 			<description>
 			</description>
 		</method>
-		<method name="is_embedding_subwindows" qualifiers="const">
-			<return type="bool" />
-			<description>
-			</description>
-		</method>
-		<method name="is_input_handled" qualifiers="const">
-			<return type="bool" />
+		<method name="push_unhandled_input">
+			<return type="void" />
+			<argument index="0" name="event" type="InputEvent" />
+			<argument index="1" name="in_local_coords" type="bool" default="false" />
 			<description>
 			</description>
 		</method>
@@ -150,13 +157,6 @@
 				Sets the number of subdivisions to use in the specified quadrant. A higher number of subdivisions allows you to have more shadows in the scene at once, but reduces the quality of the shadows. A good practice is to have quadrants with a varying number of subdivisions and to have as few subdivisions as possible.
 			</description>
 		</method>
-		<method name="unhandled_input">
-			<return type="void" />
-			<argument index="0" name="event" type="InputEvent" />
-			<argument index="1" name="in_local_coords" type="bool" default="false" />
-			<description>
-			</description>
-		</method>
 		<method name="warp_mouse">
 			<return type="void" />
 			<argument index="0" name="to_position" type="Vector2" />

+ 1 - 3
editor/animation_bezier_editor.cpp

@@ -606,7 +606,7 @@ void AnimationBezierTrackEdit::_select_at_anim(const Ref<Animation> &p_anim, int
 	update();
 }
 
-void AnimationBezierTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
+void AnimationBezierTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	if (p_event->is_pressed()) {
@@ -1131,8 +1131,6 @@ void AnimationBezierTrackEdit::set_block_animation_update_ptr(bool *p_block_ptr)
 }
 
 void AnimationBezierTrackEdit::_bind_methods() {
-	ClassDB::bind_method("_gui_input", &AnimationBezierTrackEdit::_gui_input);
-
 	ClassDB::bind_method("_clear_selection", &AnimationBezierTrackEdit::_clear_selection);
 	ClassDB::bind_method("_clear_selection_for_anim", &AnimationBezierTrackEdit::_clear_selection_for_anim);
 	ClassDB::bind_method("_select_at_anim", &AnimationBezierTrackEdit::_select_at_anim);

+ 1 - 1
editor/animation_bezier_editor.h

@@ -77,7 +77,7 @@ class AnimationBezierTrackEdit : public Control {
 
 	void _zoom_changed();
 
-	void _gui_input(const Ref<InputEvent> &p_event);
+	virtual void gui_input(const Ref<InputEvent> &p_event) override;
 	void _menu_selected(int p_index);
 
 	bool *block_animation_update_ptr; //used to block all tracks re-gen (speed up)

+ 3 - 7
editor/animation_track_editor.cpp

@@ -1642,7 +1642,7 @@ void AnimationTimelineEdit::_play_position_draw() {
 	}
 }
 
-void AnimationTimelineEdit::_gui_input(const Ref<InputEvent> &p_event) {
+void AnimationTimelineEdit::gui_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	const Ref<InputEventMouseButton> mb = p_event;
@@ -1754,8 +1754,6 @@ void AnimationTimelineEdit::_track_added(int p_track) {
 }
 
 void AnimationTimelineEdit::_bind_methods() {
-	ClassDB::bind_method("_gui_input", &AnimationTimelineEdit::_gui_input);
-
 	ADD_SIGNAL(MethodInfo("zoom_changed"));
 	ADD_SIGNAL(MethodInfo("name_limit_changed"));
 	ADD_SIGNAL(MethodInfo("timeline_changed", PropertyInfo(Variant::FLOAT, "position"), PropertyInfo(Variant::BOOL, "drag")));
@@ -2551,7 +2549,7 @@ String AnimationTrackEdit::get_tooltip(const Point2 &p_pos) const {
 	return Control::get_tooltip(p_pos);
 }
 
-void AnimationTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
+void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	if (p_event->is_pressed()) {
@@ -2965,8 +2963,6 @@ void AnimationTrackEdit::append_to_selection(const Rect2 &p_box, bool p_deselect
 }
 
 void AnimationTrackEdit::_bind_methods() {
-	ClassDB::bind_method("_gui_input", &AnimationTrackEdit::_gui_input);
-
 	ADD_SIGNAL(MethodInfo("timeline_changed", PropertyInfo(Variant::FLOAT, "position"), PropertyInfo(Variant::BOOL, "drag")));
 	ADD_SIGNAL(MethodInfo("remove_request", PropertyInfo(Variant::INT, "track")));
 	ADD_SIGNAL(MethodInfo("dropped", PropertyInfo(Variant::INT, "from_track"), PropertyInfo(Variant::INT, "to_track")));
@@ -5761,7 +5757,7 @@ void AnimationTrackEditor::_pick_track_filter_input(const Ref<InputEvent> &p_ie)
 			case KEY_DOWN:
 			case KEY_PAGEUP:
 			case KEY_PAGEDOWN: {
-				pick_track->get_scene_tree()->get_scene_tree()->call("_gui_input", k);
+				pick_track->get_scene_tree()->get_scene_tree()->gui_input(k);
 				pick_track->get_filter_line_edit()->accept_event();
 			} break;
 			default:

+ 2 - 2
editor/animation_track_editor.h

@@ -89,7 +89,7 @@ class AnimationTimelineEdit : public Range {
 	float dragging_hsize_from;
 	float dragging_hsize_at;
 
-	void _gui_input(const Ref<InputEvent> &p_event);
+	virtual void gui_input(const Ref<InputEvent> &p_event) override;
 	void _track_added(int p_track);
 
 protected:
@@ -195,7 +195,7 @@ protected:
 	static void _bind_methods();
 	void _notification(int p_what);
 
-	virtual void _gui_input(const Ref<InputEvent> &p_event);
+	virtual void gui_input(const Ref<InputEvent> &p_event) override;
 
 public:
 	virtual Variant get_drag_data(const Point2 &p_point) override;

+ 2 - 2
editor/animation_track_editor_plugins.cpp

@@ -1035,7 +1035,7 @@ void AnimationTrackEditTypeAudio::drop_data(const Point2 &p_point, const Variant
 	AnimationTrackEdit::drop_data(p_point, p_data);
 }
 
-void AnimationTrackEditTypeAudio::_gui_input(const Ref<InputEvent> &p_event) {
+void AnimationTrackEditTypeAudio::gui_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	Ref<InputEventMouseMotion> mm = p_event;
@@ -1132,7 +1132,7 @@ void AnimationTrackEditTypeAudio::_gui_input(const Ref<InputEvent> &p_event) {
 		return;
 	}
 
-	AnimationTrackEdit::_gui_input(p_event);
+	AnimationTrackEdit::gui_input(p_event);
 }
 
 ////////////////////

+ 1 - 1
editor/animation_track_editor_plugins.h

@@ -124,7 +124,7 @@ protected:
 	static void _bind_methods();
 
 public:
-	virtual void _gui_input(const Ref<InputEvent> &p_event) override;
+	virtual void gui_input(const Ref<InputEvent> &p_event) override;
 
 	virtual bool can_drop_data(const Point2 &p_point, const Variant &p_data) const override;
 	virtual void drop_data(const Point2 &p_point, const Variant &p_data) override;

+ 2 - 5
editor/code_editor.cpp

@@ -114,7 +114,7 @@ void FindReplaceBar::_notification(int p_what) {
 	}
 }
 
-void FindReplaceBar::_unhandled_input(const Ref<InputEvent> &p_event) {
+void FindReplaceBar::unhandled_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	Ref<InputEventKey> k = p_event;
@@ -611,7 +611,6 @@ void FindReplaceBar::set_text_edit(CodeTextEditor *p_text_editor) {
 }
 
 void FindReplaceBar::_bind_methods() {
-	ClassDB::bind_method("_unhandled_input", &FindReplaceBar::_unhandled_input);
 	ClassDB::bind_method("_search_current", &FindReplaceBar::search_current);
 
 	ADD_SIGNAL(MethodInfo("search"));
@@ -712,7 +711,7 @@ FindReplaceBar::FindReplaceBar() {
 
 // This function should be used to handle shortcuts that could otherwise
 // be handled too late if they weren't handled here.
-void CodeTextEditor::_input(const Ref<InputEvent> &event) {
+void CodeTextEditor::input(const Ref<InputEvent> &event) {
 	ERR_FAIL_COND(event.is_null());
 
 	const Ref<InputEventKey> key_event = event;
@@ -1753,8 +1752,6 @@ void CodeTextEditor::remove_all_bookmarks() {
 }
 
 void CodeTextEditor::_bind_methods() {
-	ClassDB::bind_method(D_METHOD("_input"), &CodeTextEditor::_input);
-
 	ADD_SIGNAL(MethodInfo("validate_script"));
 	ADD_SIGNAL(MethodInfo("load_theme_settings"));
 	ADD_SIGNAL(MethodInfo("show_errors_panel"));

+ 2 - 2
editor/code_editor.h

@@ -105,7 +105,7 @@ class FindReplaceBar : public HBoxContainer {
 
 protected:
 	void _notification(int p_what);
-	void _unhandled_input(const Ref<InputEvent> &p_event);
+	virtual void unhandled_input(const Ref<InputEvent> &p_event) override;
 
 	bool _search(uint32_t p_flags, int p_from_line, int p_from_col);
 
@@ -173,7 +173,7 @@ class CodeTextEditor : public VBoxContainer {
 	void _font_resize_timeout();
 	bool _add_font_size(int p_delta);
 
-	void _input(const Ref<InputEvent> &event);
+	virtual void input(const Ref<InputEvent> &event) override;
 	void _text_editor_gui_input(const Ref<InputEvent> &p_event);
 	void _zoom_in();
 	void _zoom_out();

+ 1 - 1
editor/create_dialog.cpp

@@ -356,7 +356,7 @@ void CreateDialog::_sbox_input(const Ref<InputEvent> &p_ie) {
 			case KEY_DOWN:
 			case KEY_PAGEUP:
 			case KEY_PAGEDOWN: {
-				search_options->call("_gui_input", k);
+				search_options->gui_input(k);
 				search_box->accept_event();
 			} break;
 			default:

+ 2 - 2
editor/editor_audio_buses.cpp

@@ -530,7 +530,7 @@ void EditorAudioBus::_effect_add(int p_which) {
 	ur->commit_action();
 }
 
-void EditorAudioBus::_gui_input(const Ref<InputEvent> &p_event) {
+void EditorAudioBus::gui_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	Ref<InputEventMouseButton> mb = p_event;
@@ -744,7 +744,7 @@ void EditorAudioBus::_effect_rmb(const Vector2 &p_pos) {
 void EditorAudioBus::_bind_methods() {
 	ClassDB::bind_method("update_bus", &EditorAudioBus::update_bus);
 	ClassDB::bind_method("update_send", &EditorAudioBus::update_send);
-	ClassDB::bind_method("_gui_input", &EditorAudioBus::_gui_input);
+
 	ClassDB::bind_method("_get_drag_data_fw", &EditorAudioBus::get_drag_data_fw);
 	ClassDB::bind_method("_can_drop_data_fw", &EditorAudioBus::can_drop_data_fw);
 	ClassDB::bind_method("_drop_data_fw", &EditorAudioBus::drop_data_fw);

+ 1 - 1
editor/editor_audio_buses.h

@@ -90,7 +90,7 @@ class EditorAudioBus : public PanelContainer {
 	bool is_master;
 	mutable bool hovering_drop;
 
-	void _gui_input(const Ref<InputEvent> &p_event);
+	virtual void gui_input(const Ref<InputEvent> &p_event) override;
 	void _effects_gui_input(Ref<InputEvent> p_event);
 	void _bus_popup_pressed(int p_option);
 

+ 3 - 3
editor/editor_command_palette.cpp

@@ -149,7 +149,7 @@ void EditorCommandPalette::_sbox_input(const Ref<InputEvent> &p_ie) {
 			case KEY_DOWN:
 			case KEY_PAGEUP:
 			case KEY_PAGEDOWN: {
-				search_options->call("_gui_input", k);
+				search_options->gui_input(k);
 			} break;
 			default:
 				break;
@@ -226,7 +226,7 @@ void EditorCommandPalette::register_shortcuts_as_command() {
 		ev.instantiate();
 		ev->set_shortcut(shortcut);
 		String shortcut_text = String(shortcut->get_as_text());
-		add_command(command_name, *key, callable_mp(EditorNode::get_singleton()->get_viewport(), &Viewport::unhandled_input), varray(ev, false), shortcut_text);
+		add_command(command_name, *key, callable_mp(EditorNode::get_singleton()->get_viewport(), &Viewport::push_unhandled_input), varray(ev, false), shortcut_text);
 		key = unregistered_shortcuts.next(key);
 	}
 	unregistered_shortcuts.clear();
@@ -238,7 +238,7 @@ Ref<Shortcut> EditorCommandPalette::add_shortcut_command(const String &p_command
 		ev.instantiate();
 		ev->set_shortcut(p_shortcut);
 		String shortcut_text = String(p_shortcut->get_as_text());
-		add_command(p_command, p_key, callable_mp(EditorNode::get_singleton()->get_viewport(), &Viewport::unhandled_input), varray(ev, false), shortcut_text);
+		add_command(p_command, p_key, callable_mp(EditorNode::get_singleton()->get_viewport(), &Viewport::push_unhandled_input), varray(ev, false), shortcut_text);
 	} else {
 		const String key_name = String(p_key);
 		const String command_name = String(p_command);

+ 1 - 1
editor/editor_command_palette.h

@@ -31,9 +31,9 @@
 #ifndef EDITOR_COMMAND_PALETTE_H
 #define EDITOR_COMMAND_PALETTE_H
 
+#include "core/input/shortcut.h"
 #include "core/os/thread_safe.h"
 #include "scene/gui/dialogs.h"
-#include "scene/gui/shortcut.h"
 #include "scene/gui/tree.h"
 
 class EditorCommandPalette : public ConfirmationDialog {

+ 1 - 3
editor/editor_file_dialog.cpp

@@ -124,7 +124,7 @@ void EditorFileDialog::_notification(int p_what) {
 	}
 }
 
-void EditorFileDialog::_unhandled_input(const Ref<InputEvent> &p_event) {
+void EditorFileDialog::unhandled_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	Ref<InputEventKey> k = p_event;
@@ -1355,8 +1355,6 @@ EditorFileDialog::DisplayMode EditorFileDialog::get_display_mode() const {
 }
 
 void EditorFileDialog::_bind_methods() {
-	ClassDB::bind_method(D_METHOD("_unhandled_input"), &EditorFileDialog::_unhandled_input);
-
 	ClassDB::bind_method(D_METHOD("_cancel_pressed"), &EditorFileDialog::_cancel_pressed);
 
 	ClassDB::bind_method(D_METHOD("clear_filters"), &EditorFileDialog::clear_filters);

+ 1 - 1
editor/editor_file_dialog.h

@@ -193,7 +193,7 @@ private:
 	void _thumbnail_done(const String &p_path, const Ref<Texture2D> &p_preview, const Ref<Texture2D> &p_small_preview, const Variant &p_udata);
 	void _request_single_thumbnail(const String &p_path);
 
-	void _unhandled_input(const Ref<InputEvent> &p_event);
+	virtual void unhandled_input(const Ref<InputEvent> &p_event) override;
 
 	bool _is_open_should_be_disabled();
 

+ 1 - 3
editor/editor_help.cpp

@@ -1825,8 +1825,6 @@ void FindBar::_notification(int p_what) {
 }
 
 void FindBar::_bind_methods() {
-	ClassDB::bind_method("_unhandled_input", &FindBar::_unhandled_input);
-
 	ADD_SIGNAL(MethodInfo("search"));
 }
 
@@ -1902,7 +1900,7 @@ void FindBar::_hide_bar() {
 	hide();
 }
 
-void FindBar::_unhandled_input(const Ref<InputEvent> &p_event) {
+void FindBar::unhandled_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	Ref<InputEventKey> k = p_event;

+ 1 - 1
editor/editor_help.h

@@ -70,7 +70,7 @@ class FindBar : public HBoxContainer {
 
 protected:
 	void _notification(int p_what);
-	void _unhandled_input(const Ref<InputEvent> &p_event);
+	virtual void unhandled_input(const Ref<InputEvent> &p_event) override;
 
 	bool _search(bool p_search_previous = false);
 

+ 1 - 1
editor/editor_help_search.cpp

@@ -71,7 +71,7 @@ void EditorHelpSearch::_search_box_gui_input(const Ref<InputEvent> &p_event) {
 			case KEY_DOWN:
 			case KEY_PAGEUP:
 			case KEY_PAGEDOWN: {
-				results_tree->call("_gui_input", key);
+				results_tree->gui_input(key);
 				search_box->accept_event();
 			} break;
 			default:

+ 2 - 5
editor/editor_inspector.cpp

@@ -692,7 +692,7 @@ bool EditorProperty::is_selected() const {
 	return selected;
 }
 
-void EditorProperty::_gui_input(const Ref<InputEvent> &p_event) {
+void EditorProperty::gui_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	if (property == StringName()) {
@@ -920,8 +920,6 @@ void EditorProperty::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("get_edited_property"), &EditorProperty::get_edited_property);
 	ClassDB::bind_method(D_METHOD("get_edited_object"), &EditorProperty::get_edited_object);
 
-	ClassDB::bind_method(D_METHOD("_gui_input"), &EditorProperty::_gui_input);
-
 	ClassDB::bind_method(D_METHOD("get_tooltip_text"), &EditorProperty::get_tooltip_text);
 	ClassDB::bind_method(D_METHOD("update_property"), &EditorProperty::update_property);
 
@@ -1319,7 +1317,7 @@ void EditorInspectorSection::setup(const String &p_section, const String &p_labe
 	}
 }
 
-void EditorInspectorSection::_gui_input(const Ref<InputEvent> &p_event) {
+void EditorInspectorSection::gui_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	if (!foldable) {
@@ -1378,7 +1376,6 @@ void EditorInspectorSection::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("get_vbox"), &EditorInspectorSection::get_vbox);
 	ClassDB::bind_method(D_METHOD("unfold"), &EditorInspectorSection::unfold);
 	ClassDB::bind_method(D_METHOD("fold"), &EditorInspectorSection::fold);
-	ClassDB::bind_method(D_METHOD("_gui_input"), &EditorInspectorSection::_gui_input);
 }
 
 EditorInspectorSection::EditorInspectorSection() {

+ 2 - 2
editor/editor_inspector.h

@@ -107,7 +107,7 @@ protected:
 	void _notification(int p_what);
 	static void _bind_methods();
 
-	void _gui_input(const Ref<InputEvent> &p_event);
+	virtual void gui_input(const Ref<InputEvent> &p_event) override;
 
 public:
 	void emit_changed(const StringName &p_property, const Variant &p_value, const StringName &p_field = StringName(), bool p_changing = false);
@@ -252,7 +252,7 @@ class EditorInspectorSection : public Container {
 protected:
 	void _notification(int p_what);
 	static void _bind_methods();
-	void _gui_input(const Ref<InputEvent> &p_event);
+	virtual void gui_input(const Ref<InputEvent> &p_event) override;
 
 public:
 	virtual Size2 get_minimum_size() const override;

+ 1 - 2
editor/editor_node.cpp

@@ -403,7 +403,7 @@ void EditorNode::_update_title() {
 	DisplayServer::get_singleton()->window_set_title(title);
 }
 
-void EditorNode::_unhandled_input(const Ref<InputEvent> &p_event) {
+void EditorNode::unhandled_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	Ref<InputEventKey> k = p_event;
@@ -5588,7 +5588,6 @@ void EditorNode::_bind_methods() {
 	ClassDB::bind_method("_editor_select", &EditorNode::_editor_select);
 	ClassDB::bind_method("_node_renamed", &EditorNode::_node_renamed);
 	ClassDB::bind_method("edit_node", &EditorNode::edit_node);
-	ClassDB::bind_method("_unhandled_input", &EditorNode::_unhandled_input);
 
 	ClassDB::bind_method(D_METHOD("push_item", "object", "property", "inspector_only"), &EditorNode::push_item, DEFVAL(""), DEFVAL(false));
 

+ 1 - 1
editor/editor_node.h

@@ -530,7 +530,7 @@ private:
 
 	bool convert_old;
 
-	void _unhandled_input(const Ref<InputEvent> &p_event);
+	virtual void unhandled_input(const Ref<InputEvent> &p_event) override;
 
 	static void _load_error_notify(void *p_ud, const String &p_text);
 

+ 1 - 2
editor/editor_properties.cpp

@@ -735,7 +735,7 @@ public:
 		return String();
 	}
 
-	void _gui_input(const Ref<InputEvent> &p_ev) {
+	void gui_input(const Ref<InputEvent> &p_ev) override {
 		const Ref<InputEventMouseMotion> mm = p_ev;
 		if (mm.is_valid()) {
 			bool expand_was_hovered = expand_hovered;
@@ -931,7 +931,6 @@ public:
 	}
 
 	static void _bind_methods() {
-		ClassDB::bind_method(D_METHOD("_gui_input"), &EditorPropertyLayersGrid::_gui_input);
 		ADD_SIGNAL(MethodInfo("flag_changed", PropertyInfo(Variant::INT, "flag")));
 	}
 };

+ 1 - 1
editor/editor_settings.h

@@ -31,13 +31,13 @@
 #ifndef EDITOR_SETTINGS_H
 #define EDITOR_SETTINGS_H
 
+#include "core/input/shortcut.h"
 #include "core/io/config_file.h"
 #include "core/io/resource.h"
 #include "core/object/class_db.h"
 #include "core/os/thread_safe.h"
 #include "core/string/translation.h"
 #include "editor/editor_paths.h"
-#include "scene/gui/shortcut.h"
 
 class EditorPlugin;
 

+ 1 - 3
editor/editor_spin_slider.cpp

@@ -52,7 +52,7 @@ String EditorSpinSlider::get_text_value() const {
 	return TS->format_number(String::num(get_value(), Math::range_step_decimals(get_step())));
 }
 
-void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) {
+void EditorSpinSlider::gui_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	if (read_only) {
@@ -564,8 +564,6 @@ void EditorSpinSlider::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_flat", "flat"), &EditorSpinSlider::set_flat);
 	ClassDB::bind_method(D_METHOD("is_flat"), &EditorSpinSlider::is_flat);
 
-	ClassDB::bind_method(D_METHOD("_gui_input"), &EditorSpinSlider::_gui_input);
-
 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "label"), "set_label", "get_label");
 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "suffix"), "set_suffix", "get_suffix");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "read_only"), "set_read_only", "is_read_only");

+ 1 - 1
editor/editor_spin_slider.h

@@ -85,7 +85,7 @@ class EditorSpinSlider : public Range {
 
 protected:
 	void _notification(int p_what);
-	void _gui_input(const Ref<InputEvent> &p_event);
+	virtual void gui_input(const Ref<InputEvent> &p_event) override;
 	static void _bind_methods();
 	void _grabber_mouse_entered();
 	void _grabber_mouse_exited();

+ 1 - 2
editor/plugins/animation_player_editor_plugin.cpp

@@ -1220,7 +1220,7 @@ void AnimationPlayerEditor::_onion_skinning_menu(int p_option) {
 	}
 }
 
-void AnimationPlayerEditor::_unhandled_key_input(const Ref<InputEvent> &p_ev) {
+void AnimationPlayerEditor::unhandled_key_input(const Ref<InputEvent> &p_ev) {
 	ERR_FAIL_COND(p_ev.is_null());
 
 	Ref<InputEventKey> k = p_ev;
@@ -1497,7 +1497,6 @@ void AnimationPlayerEditor::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("_animation_player_changed"), &AnimationPlayerEditor::_animation_player_changed);
 	ClassDB::bind_method(D_METHOD("_list_changed"), &AnimationPlayerEditor::_list_changed);
 	ClassDB::bind_method(D_METHOD("_animation_duplicate"), &AnimationPlayerEditor::_animation_duplicate);
-	ClassDB::bind_method(D_METHOD("_unhandled_key_input"), &AnimationPlayerEditor::_unhandled_key_input);
 
 	ClassDB::bind_method(D_METHOD("_prepare_onion_layers_1"), &AnimationPlayerEditor::_prepare_onion_layers_1);
 	ClassDB::bind_method(D_METHOD("_prepare_onion_layers_2"), &AnimationPlayerEditor::_prepare_onion_layers_2);

+ 1 - 1
editor/plugins/animation_player_editor_plugin.h

@@ -200,7 +200,7 @@ class AnimationPlayerEditor : public VBoxContainer {
 	void _animation_key_editor_seek(float p_pos, bool p_drag, bool p_timeline_only = false);
 	void _animation_key_editor_anim_len_changed(float p_len);
 
-	void _unhandled_key_input(const Ref<InputEvent> &p_ev);
+	virtual void unhandled_key_input(const Ref<InputEvent> &p_ev) override;
 	void _animation_tool_menu(int p_option);
 	void _onion_skinning_menu(int p_option);
 

+ 1 - 3
editor/plugins/asset_library_editor_plugin.cpp

@@ -614,7 +614,7 @@ void EditorAssetLibrary::_update_repository_options() {
 	}
 }
 
-void EditorAssetLibrary::_unhandled_key_input(const Ref<InputEvent> &p_event) {
+void EditorAssetLibrary::unhandled_key_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	const Ref<InputEventKey> key = p_event;
@@ -1322,8 +1322,6 @@ void EditorAssetLibrary::disable_community_support() {
 }
 
 void EditorAssetLibrary::_bind_methods() {
-	ClassDB::bind_method("_unhandled_key_input", &EditorAssetLibrary::_unhandled_key_input);
-
 	ADD_SIGNAL(MethodInfo("install_asset", PropertyInfo(Variant::STRING, "zip_path"), PropertyInfo(Variant::STRING, "name")));
 }
 

+ 1 - 1
editor/plugins/asset_library_editor_plugin.h

@@ -299,7 +299,7 @@ class EditorAssetLibrary : public PanelContainer {
 protected:
 	static void _bind_methods();
 	void _notification(int p_what);
-	void _unhandled_key_input(const Ref<InputEvent> &p_event);
+	virtual void unhandled_key_input(const Ref<InputEvent> &p_event) override;
 
 public:
 	void disable_community_support();

+ 2 - 2
editor/plugins/canvas_item_editor_plugin.cpp

@@ -472,7 +472,7 @@ real_t CanvasItemEditor::snap_angle(real_t p_target, real_t p_start) const {
 	}
 }
 
-void CanvasItemEditor::_unhandled_key_input(const Ref<InputEvent> &p_ev) {
+void CanvasItemEditor::unhandled_key_input(const Ref<InputEvent> &p_ev) {
 	ERR_FAIL_COND(p_ev.is_null());
 
 	Ref<InputEventKey> k = p_ev;
@@ -4918,7 +4918,7 @@ void CanvasItemEditor::_focus_selection(int p_op) {
 void CanvasItemEditor::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("_update_override_camera_button", "game_running"), &CanvasItemEditor::_update_override_camera_button);
 	ClassDB::bind_method("_get_editor_data", &CanvasItemEditor::_get_editor_data);
-	ClassDB::bind_method("_unhandled_key_input", &CanvasItemEditor::_unhandled_key_input);
+
 	ClassDB::bind_method(D_METHOD("set_state"), &CanvasItemEditor::set_state);
 	ClassDB::bind_method(D_METHOD("update_viewport"), &CanvasItemEditor::update_viewport);
 	ClassDB::bind_method(D_METHOD("_zoom_on_position"), &CanvasItemEditor::_zoom_on_position);

+ 1 - 1
editor/plugins/canvas_item_editor_plugin.h

@@ -455,7 +455,7 @@ private:
 
 	void _keying_changed();
 
-	void _unhandled_key_input(const Ref<InputEvent> &p_ev);
+	virtual void unhandled_key_input(const Ref<InputEvent> &p_ev) override;
 
 	void _draw_text_at_position(Point2 p_position, String p_string, Side p_side);
 	void _draw_margin_at_position(int p_value, Point2 p_position, Side p_side);

+ 1 - 5
editor/plugins/curve_editor_plugin.cpp

@@ -101,7 +101,7 @@ void CurveEditor::_notification(int p_what) {
 	}
 }
 
-void CurveEditor::on_gui_input(const Ref<InputEvent> &p_event) {
+void CurveEditor::gui_input(const Ref<InputEvent> &p_event) {
 	Ref<InputEventMouseButton> mb_ref = p_event;
 	if (mb_ref.is_valid()) {
 		const InputEventMouseButton &mb = **mb_ref;
@@ -757,10 +757,6 @@ void CurveEditor::_draw() {
 	}
 }
 
-void CurveEditor::_bind_methods() {
-	ClassDB::bind_method(D_METHOD("_gui_input"), &CurveEditor::on_gui_input);
-}
-
 //---------------
 
 bool EditorInspectorPluginCurve::can_handle(Object *p_object) {

+ 1 - 3
editor/plugins/curve_editor_plugin.h

@@ -74,10 +74,8 @@ public:
 protected:
 	void _notification(int p_what);
 
-	static void _bind_methods();
-
 private:
-	void on_gui_input(const Ref<InputEvent> &p_event);
+	virtual void gui_input(const Ref<InputEvent> &p_event) override;
 	void on_preset_item_selected(int preset_id);
 	void _curve_changed();
 	void on_context_menu_item_selected(int action_id);

+ 1 - 5
editor/plugins/mesh_editor_plugin.cpp

@@ -32,7 +32,7 @@
 
 #include "editor/editor_scale.h"
 
-void MeshEditor::_gui_input(Ref<InputEvent> p_event) {
+void MeshEditor::gui_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	Ref<InputEventMouseMotion> mm = p_event;
@@ -103,10 +103,6 @@ void MeshEditor::_button_pressed(Node *p_button) {
 	}
 }
 
-void MeshEditor::_bind_methods() {
-	ClassDB::bind_method(D_METHOD("_gui_input"), &MeshEditor::_gui_input);
-}
-
 MeshEditor::MeshEditor() {
 	viewport = memnew(SubViewport);
 	Ref<World3D> world_3d;

+ 1 - 2
editor/plugins/mesh_editor_plugin.h

@@ -64,8 +64,7 @@ class MeshEditor : public SubViewportContainer {
 
 protected:
 	void _notification(int p_what);
-	void _gui_input(Ref<InputEvent> p_event);
-	static void _bind_methods();
+	void gui_input(const Ref<InputEvent> &p_event) override;
 
 public:
 	void edit(Ref<Mesh> p_mesh);

+ 3 - 12
editor/plugins/node_3d_editor_plugin.cpp

@@ -181,7 +181,7 @@ void ViewportRotationControl::_get_sorted_axis(Vector<Axis2D> &r_axis) {
 	r_axis.sort_custom<Axis2DCompare>();
 }
 
-void ViewportRotationControl::_gui_input(Ref<InputEvent> p_event) {
+void ViewportRotationControl::gui_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	const Ref<InputEventMouseButton> mb = p_event;
@@ -252,10 +252,6 @@ void ViewportRotationControl::set_viewport(Node3DEditorViewport *p_viewport) {
 	viewport = p_viewport;
 }
 
-void ViewportRotationControl::_bind_methods() {
-	ClassDB::bind_method(D_METHOD("_gui_input"), &ViewportRotationControl::_gui_input);
-}
-
 void Node3DEditorViewport::_update_camera(real_t p_interp_delta) {
 	bool is_orthogonal = camera->get_projection() == Camera3D::PROJECTION_ORTHOGONAL;
 
@@ -4428,7 +4424,7 @@ Node3DEditorViewport::~Node3DEditorViewport() {
 
 //////////////////////////////////////////////////////////////
 
-void Node3DEditorViewportContainer::_gui_input(const Ref<InputEvent> &p_event) {
+void Node3DEditorViewportContainer::gui_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	Ref<InputEventMouseButton> mb = p_event;
@@ -4720,10 +4716,6 @@ Node3DEditorViewportContainer::View Node3DEditorViewportContainer::get_view() {
 	return view;
 }
 
-void Node3DEditorViewportContainer::_bind_methods() {
-	ClassDB::bind_method("_gui_input", &Node3DEditorViewportContainer::_gui_input);
-}
-
 Node3DEditorViewportContainer::Node3DEditorViewportContainer() {
 	set_clip_contents(true);
 	view = VIEW_USE_1_VIEWPORT;
@@ -6512,7 +6504,7 @@ void Node3DEditor::snap_selected_nodes_to_floor() {
 	}
 }
 
-void Node3DEditor::_unhandled_key_input(Ref<InputEvent> p_event) {
+void Node3DEditor::unhandled_key_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	if (!is_visible_in_tree()) {
@@ -6890,7 +6882,6 @@ void Node3DEditor::_register_all_gizmos() {
 }
 
 void Node3DEditor::_bind_methods() {
-	ClassDB::bind_method("_unhandled_key_input", &Node3DEditor::_unhandled_key_input);
 	ClassDB::bind_method("_get_editor_data", &Node3DEditor::_get_editor_data);
 	ClassDB::bind_method("_request_gizmo", &Node3DEditor::_request_gizmo);
 	ClassDB::bind_method("_clear_subgizmo_selection", &Node3DEditor::_clear_subgizmo_selection);

+ 3 - 5
editor/plugins/node_3d_editor_plugin.h

@@ -74,9 +74,8 @@ class ViewportRotationControl : public Control {
 	const float AXIS_CIRCLE_RADIUS = 8.0f * EDSCALE;
 
 protected:
-	static void _bind_methods();
 	void _notification(int p_what);
-	void _gui_input(Ref<InputEvent> p_event);
+	virtual void gui_input(const Ref<InputEvent> &p_event) override;
 	void _draw();
 	void _draw_axis(const Axis2D &p_axis);
 	void _get_sorted_axis(Vector<Axis2D> &r_axis);
@@ -470,11 +469,10 @@ private:
 	Vector2 drag_begin_pos;
 	Vector2 drag_begin_ratio;
 
-	void _gui_input(const Ref<InputEvent> &p_event);
+	virtual void gui_input(const Ref<InputEvent> &p_event) override;
 
 protected:
 	void _notification(int p_what);
-	static void _bind_methods();
 
 public:
 	void set_view(View p_view);
@@ -744,7 +742,7 @@ private:
 protected:
 	void _notification(int p_what);
 	//void _gui_input(InputEvent p_event);
-	void _unhandled_key_input(Ref<InputEvent> p_event);
+	virtual void unhandled_key_input(const Ref<InputEvent> &p_event) override;
 
 	static void _bind_methods();
 

+ 0 - 4
editor/plugins/resource_preloader_editor_plugin.cpp

@@ -35,9 +35,6 @@
 #include "editor/editor_scale.h"
 #include "editor/editor_settings.h"
 
-void ResourcePreloaderEditor::_gui_input(Ref<InputEvent> p_event) {
-}
-
 void ResourcePreloaderEditor::_notification(int p_what) {
 	if (p_what == NOTIFICATION_ENTER_TREE) {
 		load->set_icon(get_theme_icon(SNAME("Folder"), SNAME("EditorIcons")));
@@ -335,7 +332,6 @@ void ResourcePreloaderEditor::drop_data_fw(const Point2 &p_point, const Variant
 }
 
 void ResourcePreloaderEditor::_bind_methods() {
-	ClassDB::bind_method(D_METHOD("_gui_input"), &ResourcePreloaderEditor::_gui_input);
 	ClassDB::bind_method(D_METHOD("_update_library"), &ResourcePreloaderEditor::_update_library);
 	ClassDB::bind_method(D_METHOD("_remove_resource", "to_remove"), &ResourcePreloaderEditor::_remove_resource);
 

+ 1 - 1
editor/plugins/resource_preloader_editor_plugin.h

@@ -75,7 +75,7 @@ class ResourcePreloaderEditor : public PanelContainer {
 
 protected:
 	void _notification(int p_what);
-	void _gui_input(Ref<InputEvent> p_event);
+
 	static void _bind_methods();
 
 public:

+ 3 - 3
editor/plugins/script_editor_plugin.cpp

@@ -316,7 +316,7 @@ void ScriptEditorQuickOpen::_sbox_input(const Ref<InputEvent> &p_ie) {
 								k->get_keycode() == KEY_DOWN ||
 								k->get_keycode() == KEY_PAGEUP ||
 								k->get_keycode() == KEY_PAGEDOWN)) {
-		search_options->call("_gui_input", k);
+		search_options->gui_input(k);
 		search_box->accept_event();
 	}
 }
@@ -2728,7 +2728,7 @@ void ScriptEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Co
 	}
 }
 
-void ScriptEditor::_unhandled_key_input(const Ref<InputEvent> &p_event) {
+void ScriptEditor::unhandled_key_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	if (!is_visible_in_tree() || !p_event->is_pressed() || p_event->is_echo()) {
@@ -3272,7 +3272,7 @@ void ScriptEditor::_bind_methods() {
 	ClassDB::bind_method("_update_script_connections", &ScriptEditor::_update_script_connections);
 	ClassDB::bind_method("_help_class_open", &ScriptEditor::_help_class_open);
 	ClassDB::bind_method("_live_auto_reload_running_scripts", &ScriptEditor::_live_auto_reload_running_scripts);
-	ClassDB::bind_method("_unhandled_key_input", &ScriptEditor::_unhandled_key_input);
+
 	ClassDB::bind_method("_update_members_overview", &ScriptEditor::_update_members_overview);
 	ClassDB::bind_method("_update_recent_scripts", &ScriptEditor::_update_recent_scripts);
 

+ 1 - 1
editor/plugins/script_editor_plugin.h

@@ -411,7 +411,7 @@ class ScriptEditor : public PanelContainer {
 	bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const;
 	void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from);
 
-	void _unhandled_key_input(const Ref<InputEvent> &p_event);
+	virtual void unhandled_key_input(const Ref<InputEvent> &p_event) override;
 
 	void _script_list_gui_input(const Ref<InputEvent> &ev);
 	void _make_script_list_context_menu();

+ 1 - 1
editor/plugins/sprite_frames_editor_plugin.cpp

@@ -40,7 +40,7 @@
 #include "scene/gui/margin_container.h"
 #include "scene/gui/panel_container.h"
 
-void SpriteFramesEditor::_gui_input(Ref<InputEvent> p_event) {
+void SpriteFramesEditor::gui_input(const Ref<InputEvent> &p_event) {
 }
 
 void SpriteFramesEditor::_open_sprite_sheet() {

+ 1 - 1
editor/plugins/sprite_frames_editor_plugin.h

@@ -147,7 +147,7 @@ class SpriteFramesEditor : public HSplitContainer {
 
 protected:
 	void _notification(int p_what);
-	void _gui_input(Ref<InputEvent> p_event);
+	virtual void gui_input(const Ref<InputEvent> &p_event) override;
 	static void _bind_methods();
 
 public:

+ 0 - 4
editor/plugins/texture_3d_editor_plugin.cpp

@@ -34,9 +34,6 @@
 #include "core/io/resource_loader.h"
 #include "editor/editor_settings.h"
 
-void Texture3DEditor::_gui_input(Ref<InputEvent> p_event) {
-}
-
 void Texture3DEditor::_texture_rect_draw() {
 	texture_rect->draw_rect(Rect2(Point2(), texture_rect->get_size()), Color(1, 1, 1, 1));
 }
@@ -145,7 +142,6 @@ void Texture3DEditor::edit(Ref<Texture3D> p_texture) {
 }
 
 void Texture3DEditor::_bind_methods() {
-	ClassDB::bind_method(D_METHOD("_gui_input"), &Texture3DEditor::_gui_input);
 	ClassDB::bind_method(D_METHOD("_layer_changed"), &Texture3DEditor::_layer_changed);
 }
 

+ 0 - 1
editor/plugins/texture_3d_editor_plugin.h

@@ -65,7 +65,6 @@ class Texture3DEditor : public Control {
 
 protected:
 	void _notification(int p_what);
-	void _gui_input(Ref<InputEvent> p_event);
 
 	static void _bind_methods();
 

+ 1 - 2
editor/plugins/texture_layered_editor_plugin.cpp

@@ -34,7 +34,7 @@
 #include "core/io/resource_loader.h"
 #include "editor/editor_settings.h"
 
-void TextureLayeredEditor::_gui_input(Ref<InputEvent> p_event) {
+void TextureLayeredEditor::gui_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	Ref<InputEventMouseMotion> mm = p_event;
@@ -214,7 +214,6 @@ void TextureLayeredEditor::edit(Ref<TextureLayered> p_texture) {
 }
 
 void TextureLayeredEditor::_bind_methods() {
-	ClassDB::bind_method(D_METHOD("_gui_input"), &TextureLayeredEditor::_gui_input);
 	ClassDB::bind_method(D_METHOD("_layer_changed"), &TextureLayeredEditor::_layer_changed);
 }
 

+ 1 - 1
editor/plugins/texture_layered_editor_plugin.h

@@ -67,7 +67,7 @@ class TextureLayeredEditor : public Control {
 
 protected:
 	void _notification(int p_what);
-	void _gui_input(Ref<InputEvent> p_event);
+	virtual void gui_input(const Ref<InputEvent> &p_event) override;
 	static void _bind_methods();
 
 public:

+ 2 - 4
editor/plugins/tiles/tile_atlas_view.cpp

@@ -41,7 +41,7 @@
 #include "editor/editor_scale.h"
 #include "editor/editor_settings.h"
 
-void TileAtlasView::_gui_input(const Ref<InputEvent> &p_event) {
+void TileAtlasView::gui_input(const Ref<InputEvent> &p_event) {
 	Ref<InputEventMouseButton> mb = p_event;
 	if (mb.is_valid()) {
 		drag_type = DRAG_TYPE_NONE;
@@ -548,8 +548,6 @@ void TileAtlasView::_notification(int p_what) {
 }
 
 void TileAtlasView::_bind_methods() {
-	ClassDB::bind_method("_gui_input", &TileAtlasView::_gui_input);
-
 	ADD_SIGNAL(MethodInfo("transform_changed", PropertyInfo(Variant::FLOAT, "zoom"), PropertyInfo(Variant::VECTOR2, "scroll")));
 }
 
@@ -582,7 +580,7 @@ TileAtlasView::TileAtlasView() {
 	center_container = memnew(CenterContainer);
 	center_container->set_mouse_filter(Control::MOUSE_FILTER_IGNORE);
 	center_container->set_anchors_preset(Control::PRESET_CENTER);
-	center_container->connect("gui_input", callable_mp(this, &TileAtlasView::_gui_input));
+	center_container->connect("gui_input", callable_mp(this, &TileAtlasView::gui_input));
 	panel->add_child(center_container);
 
 	missing_source_label = memnew(Label);

+ 1 - 1
editor/plugins/tiles/tile_atlas_view.h

@@ -62,7 +62,7 @@ private:
 	void _update_zoom_and_panning(bool p_zoom_on_mouse_pos = false);
 	void _zoom_widget_changed();
 	void _center_view();
-	void _gui_input(const Ref<InputEvent> &p_event);
+	virtual void gui_input(const Ref<InputEvent> &p_event) override;
 
 	Map<Vector2, Map<int, Rect2i>> alternative_tiles_rect_cache;
 	void _update_alternative_tiles_rect_cache();

+ 1 - 1
editor/plugins/visual_shader_editor_plugin.cpp

@@ -3171,7 +3171,7 @@ void VisualShaderEditor::_sbox_input(const Ref<InputEvent> &p_ie) {
 								 ie->get_keycode() == KEY_DOWN ||
 								 ie->get_keycode() == KEY_ENTER ||
 								 ie->get_keycode() == KEY_KP_ENTER)) {
-		members->call("_gui_input", ie);
+		members->gui_input(ie);
 		node_filter->accept_event();
 	}
 }

+ 1 - 2
editor/project_manager.cpp

@@ -1887,7 +1887,7 @@ void ProjectManager::_update_project_buttons() {
 	erase_missing_btn->set_disabled(!_project_list->is_any_project_missing());
 }
 
-void ProjectManager::_unhandled_key_input(const Ref<InputEvent> &p_ev) {
+void ProjectManager::unhandled_key_input(const Ref<InputEvent> &p_ev) {
 	ERR_FAIL_COND(p_ev.is_null());
 
 	Ref<InputEventKey> k = p_ev;
@@ -2364,7 +2364,6 @@ void ProjectManager::_on_search_term_changed(const String &p_term) {
 }
 
 void ProjectManager::_bind_methods() {
-	ClassDB::bind_method("_unhandled_key_input", &ProjectManager::_unhandled_key_input);
 	ClassDB::bind_method("_update_project_buttons", &ProjectManager::_update_project_buttons);
 	ClassDB::bind_method("_version_button_pressed", &ProjectManager::_version_button_pressed);
 }

+ 1 - 1
editor/project_manager.h

@@ -121,7 +121,7 @@ class ProjectManager : public Control {
 	void _install_project(const String &p_zip_path, const String &p_title);
 
 	void _dim_window();
-	void _unhandled_key_input(const Ref<InputEvent> &p_ev);
+	virtual void unhandled_key_input(const Ref<InputEvent> &p_ev) override;
 	void _files_dropped(PackedStringArray p_files, int p_screen);
 
 	void _version_button_pressed();

+ 1 - 1
editor/property_selector.cpp

@@ -48,7 +48,7 @@ void PropertySelector::_sbox_input(const Ref<InputEvent> &p_ie) {
 			case KEY_DOWN:
 			case KEY_PAGEUP:
 			case KEY_PAGEDOWN: {
-				search_options->call("_gui_input", k);
+				search_options->gui_input(k);
 				search_box->accept_event();
 
 				TreeItem *root = search_options->get_root();

+ 1 - 1
editor/quick_open.cpp

@@ -170,7 +170,7 @@ void EditorQuickOpen::_sbox_input(const Ref<InputEvent> &p_ie) {
 			case KEY_DOWN:
 			case KEY_PAGEUP:
 			case KEY_PAGEDOWN: {
-				search_options->call("_gui_input", k);
+				search_options->gui_input(k);
 				search_box->accept_event();
 
 				if (allow_multi_select) {

+ 3 - 4
editor/scene_tree_dock.cpp

@@ -62,7 +62,7 @@ void SceneTreeDock::_quick_open() {
 	instantiate_scenes(quick_open->get_selected_files(), scene_tree->get_selected());
 }
 
-void SceneTreeDock::_input(Ref<InputEvent> p_event) {
+void SceneTreeDock::input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	Ref<InputEventMouseButton> mb = p_event;
@@ -72,7 +72,7 @@ void SceneTreeDock::_input(Ref<InputEvent> p_event) {
 	}
 }
 
-void SceneTreeDock::_unhandled_key_input(Ref<InputEvent> p_event) {
+void SceneTreeDock::unhandled_key_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	if (get_focus_owner() && get_focus_owner()->is_text_field()) {
@@ -3163,8 +3163,7 @@ void SceneTreeDock::_create_remap_for_resource(RES p_resource, Map<RES, RES> &r_
 
 void SceneTreeDock::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("_set_owners"), &SceneTreeDock::_set_owners);
-	ClassDB::bind_method(D_METHOD("_unhandled_key_input"), &SceneTreeDock::_unhandled_key_input);
-	ClassDB::bind_method(D_METHOD("_input"), &SceneTreeDock::_input);
+
 	ClassDB::bind_method(D_METHOD("_update_script_button"), &SceneTreeDock::_update_script_button);
 
 	ClassDB::bind_method(D_METHOD("instantiate"), &SceneTreeDock::instantiate);

+ 2 - 2
editor/scene_tree_dock.h

@@ -210,8 +210,8 @@ class SceneTreeDock : public VBoxContainer {
 	void _node_prerenamed(Node *p_node, const String &p_new_name);
 
 	void _nodes_drag_begin();
-	void _input(Ref<InputEvent> p_event);
-	void _unhandled_key_input(Ref<InputEvent> p_event);
+	virtual void input(const Ref<InputEvent> &p_event) override;
+	virtual void unhandled_key_input(const Ref<InputEvent> &p_event) override;
 
 	void _import_subscene();
 

+ 1 - 2
editor/settings_config_dialog.cpp

@@ -138,7 +138,7 @@ void EditorSettingsDialog::_notification(int p_what) {
 	}
 }
 
-void EditorSettingsDialog::_unhandled_input(const Ref<InputEvent> &p_event) {
+void EditorSettingsDialog::unhandled_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	const Ref<InputEventKey> k = p_event;
@@ -542,7 +542,6 @@ void EditorSettingsDialog::_editor_restart_close() {
 }
 
 void EditorSettingsDialog::_bind_methods() {
-	ClassDB::bind_method(D_METHOD("_unhandled_input"), &EditorSettingsDialog::_unhandled_input);
 	ClassDB::bind_method(D_METHOD("_update_shortcuts"), &EditorSettingsDialog::_update_shortcuts);
 	ClassDB::bind_method(D_METHOD("_settings_changed"), &EditorSettingsDialog::_settings_changed);
 }

+ 1 - 1
editor/settings_config_dialog.h

@@ -83,7 +83,7 @@ class EditorSettingsDialog : public AcceptDialog {
 	void _settings_property_edited(const String &p_name);
 	void _settings_save();
 
-	void _unhandled_input(const Ref<InputEvent> &p_event);
+	virtual void unhandled_input(const Ref<InputEvent> &p_event) override;
 	void _notification(int p_what);
 	void _update_icons();
 

+ 1 - 1
modules/gridmap/grid_map_editor_plugin.cpp

@@ -790,7 +790,7 @@ void GridMapEditor::_sbox_input(const Ref<InputEvent> &p_ie) {
 
 	if (k.is_valid() && (k->get_keycode() == KEY_UP || k->get_keycode() == KEY_DOWN || k->get_keycode() == KEY_PAGEUP || k->get_keycode() == KEY_PAGEDOWN)) {
 		// Forward the key input to the ItemList so it can be scrolled
-		mesh_library_palette->call("_gui_input", k);
+		mesh_library_palette->gui_input(k);
 		search_box->accept_event();
 	}
 }

+ 0 - 20
modules/visual_script/visual_script.cpp

@@ -1845,26 +1845,6 @@ void VisualScriptInstance::create(const Ref<VisualScript> &p_script, Object *p_o
 	max_input_args = 0;
 	max_output_args = 0;
 
-	if (Object::cast_to<Node>(p_owner)) {
-		// Turn on these if they exist and base is a node.
-		Node *node = Object::cast_to<Node>(p_owner);
-		if (p_script->functions.has("_process")) {
-			node->set_process(true);
-		}
-		if (p_script->functions.has("_physics_process")) {
-			node->set_physics_process(true);
-		}
-		if (p_script->functions.has("_input")) {
-			node->set_process_input(true);
-		}
-		if (p_script->functions.has("_unhandled_input")) {
-			node->set_process_unhandled_input(true);
-		}
-		if (p_script->functions.has("_unhandled_key_input")) {
-			node->set_process_unhandled_key_input(true);
-		}
-	}
-
 	// Setup variables.
 	{
 		List<StringName> keys;

+ 1 - 3
modules/visual_script/visual_script_editor.cpp

@@ -1816,7 +1816,7 @@ void VisualScriptEditor::_generic_search(String p_base_type, Vector2 pos, bool n
 	}
 }
 
-void VisualScriptEditor::_input(const Ref<InputEvent> &p_event) {
+void VisualScriptEditor::input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	// GUI input for VS Editor Plugin
@@ -4246,8 +4246,6 @@ void VisualScriptEditor::_bind_methods() {
 	ClassDB::bind_method("_can_drop_data_fw", &VisualScriptEditor::can_drop_data_fw);
 	ClassDB::bind_method("_drop_data_fw", &VisualScriptEditor::drop_data_fw);
 
-	ClassDB::bind_method("_input", &VisualScriptEditor::_input);
-
 	ClassDB::bind_method("_update_graph_connections", &VisualScriptEditor::_update_graph_connections);
 	ClassDB::bind_method("_update_members", &VisualScriptEditor::_update_members);
 

+ 1 - 1
modules/visual_script/visual_script_editor.h

@@ -234,7 +234,7 @@ class VisualScriptEditor : public ScriptEditorBase {
 
 	void _generic_search(String p_base_type = "", Vector2 pos = Vector2(), bool node_centered = false);
 
-	void _input(const Ref<InputEvent> &p_event);
+	virtual void input(const Ref<InputEvent> &p_event) override;
 	void _graph_gui_input(const Ref<InputEvent> &p_event);
 	void _members_gui_input(const Ref<InputEvent> &p_event);
 	void _fn_name_box_input(const Ref<InputEvent> &p_event);

+ 1 - 1
modules/visual_script/visual_script_property_selector.cpp

@@ -55,7 +55,7 @@ void VisualScriptPropertySelector::_sbox_input(const Ref<InputEvent> &p_ie) {
 			case KEY_DOWN:
 			case KEY_PAGEUP:
 			case KEY_PAGEDOWN: {
-				search_options->call("_gui_input", k);
+				search_options->gui_input(k);
 				search_box->accept_event();
 
 				TreeItem *root = search_options->get_root();

+ 3 - 5
scene/2d/collision_object_2d.cpp

@@ -481,10 +481,8 @@ bool CollisionObject2D::is_pickable() const {
 	return pickable;
 }
 
-void CollisionObject2D::_input_event(Node *p_viewport, const Ref<InputEvent> &p_input_event, int p_shape) {
-	if (get_script_instance()) {
-		get_script_instance()->call(SceneStringNames::get_singleton()->_input_event, p_viewport, p_input_event, p_shape);
-	}
+void CollisionObject2D::_input_event_call(Viewport *p_viewport, const Ref<InputEvent> &p_input_event, int p_shape) {
+	GDVIRTUAL_CALL(_input_event, p_viewport, p_input_event, p_shape);
 	emit_signal(SceneStringNames::get_singleton()->input_event, p_viewport, p_input_event, p_shape);
 }
 
@@ -597,7 +595,7 @@ void CollisionObject2D::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("shape_owner_clear_shapes", "owner_id"), &CollisionObject2D::shape_owner_clear_shapes);
 	ClassDB::bind_method(D_METHOD("shape_find_owner", "shape_index"), &CollisionObject2D::shape_find_owner);
 
-	BIND_VMETHOD(MethodInfo("_input_event", PropertyInfo(Variant::OBJECT, "viewport"), PropertyInfo(Variant::OBJECT, "event", PROPERTY_HINT_RESOURCE_TYPE, "InputEvent"), PropertyInfo(Variant::INT, "shape_idx")));
+	GDVIRTUAL_BIND(_input_event, "viewport", "event", "shape_idx");
 
 	ADD_SIGNAL(MethodInfo("input_event", PropertyInfo(Variant::OBJECT, "viewport", PROPERTY_HINT_RESOURCE_TYPE, "Node"), PropertyInfo(Variant::OBJECT, "event", PROPERTY_HINT_RESOURCE_TYPE, "InputEvent"), PropertyInfo(Variant::INT, "shape_idx")));
 	ADD_SIGNAL(MethodInfo("mouse_entered"));

+ 3 - 1
scene/2d/collision_object_2d.h

@@ -32,6 +32,7 @@
 #define COLLISION_OBJECT_2D_H
 
 #include "scene/2d/node_2d.h"
+#include "scene/main/viewport.h"
 #include "scene/resources/shape_2d.h"
 #include "servers/physics_server_2d.h"
 
@@ -88,7 +89,7 @@ protected:
 
 	void _update_pickable();
 	friend class Viewport;
-	void _input_event(Node *p_viewport, const Ref<InputEvent> &p_input_event, int p_shape);
+	void _input_event_call(Viewport *p_viewport, const Ref<InputEvent> &p_input_event, int p_shape);
 	void _mouse_enter();
 	void _mouse_exit();
 
@@ -100,6 +101,7 @@ protected:
 
 	void set_body_mode(PhysicsServer2D::BodyMode p_mode);
 
+	GDVIRTUAL3(_input_event, Viewport *, Ref<InputEvent>, int)
 public:
 	void set_collision_layer(uint32_t p_layer);
 	uint32_t get_collision_layer() const;

+ 3 - 5
scene/2d/touch_screen_button.cpp

@@ -185,7 +185,7 @@ String TouchScreenButton::get_action() const {
 	return action;
 }
 
-void TouchScreenButton::_input(const Ref<InputEvent> &p_event) {
+void TouchScreenButton::input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	if (!get_tree()) {
@@ -288,7 +288,7 @@ void TouchScreenButton::_press(int p_finger_pressed) {
 		iea.instantiate();
 		iea->set_action(action);
 		iea->set_pressed(true);
-		get_viewport()->input(iea, true);
+		get_viewport()->push_input(iea, true);
 	}
 
 	emit_signal(SNAME("pressed"));
@@ -305,7 +305,7 @@ void TouchScreenButton::_release(bool p_exiting_tree) {
 			iea.instantiate();
 			iea->set_action(action);
 			iea->set_pressed(false);
-			get_viewport()->input(iea, true);
+			get_viewport()->push_input(iea, true);
 		}
 	}
 
@@ -384,8 +384,6 @@ void TouchScreenButton::_bind_methods() {
 
 	ClassDB::bind_method(D_METHOD("is_pressed"), &TouchScreenButton::is_pressed);
 
-	ClassDB::bind_method(D_METHOD("_input"), &TouchScreenButton::_input);
-
 	ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "normal", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"), "set_texture", "get_texture");
 	ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "pressed", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"), "set_texture_pressed", "get_texture_pressed");
 	ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "bitmask", PROPERTY_HINT_RESOURCE_TYPE, "BitMap"), "set_bitmask", "get_bitmask");

+ 1 - 1
scene/2d/touch_screen_button.h

@@ -61,7 +61,7 @@ private:
 
 	VisibilityMode visibility = VISIBILITY_ALWAYS;
 
-	void _input(const Ref<InputEvent> &p_event);
+	virtual void input(const Ref<InputEvent> &p_event) override;
 
 	bool _is_point_inside(const Point2 &p_point);
 

+ 3 - 5
scene/3d/collision_object_3d.cpp

@@ -254,10 +254,8 @@ void CollisionObject3D::_apply_enabled() {
 	}
 }
 
-void CollisionObject3D::_input_event(Node *p_camera, const Ref<InputEvent> &p_input_event, const Vector3 &p_pos, const Vector3 &p_normal, int p_shape) {
-	if (get_script_instance()) {
-		get_script_instance()->call(SceneStringNames::get_singleton()->_input_event, p_camera, p_input_event, p_pos, p_normal, p_shape);
-	}
+void CollisionObject3D::_input_event_call(Camera3D *p_camera, const Ref<InputEvent> &p_input_event, const Vector3 &p_pos, const Vector3 &p_normal, int p_shape) {
+	GDVIRTUAL_CALL(_input_event, p_camera, p_input_event, p_pos, p_normal, p_shape);
 	emit_signal(SceneStringNames::get_singleton()->input_event, p_camera, p_input_event, p_pos, p_normal, p_shape);
 }
 
@@ -453,7 +451,7 @@ void CollisionObject3D::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("shape_owner_clear_shapes", "owner_id"), &CollisionObject3D::shape_owner_clear_shapes);
 	ClassDB::bind_method(D_METHOD("shape_find_owner", "shape_index"), &CollisionObject3D::shape_find_owner);
 
-	BIND_VMETHOD(MethodInfo("_input_event", PropertyInfo(Variant::OBJECT, "camera"), PropertyInfo(Variant::OBJECT, "event", PROPERTY_HINT_RESOURCE_TYPE, "InputEvent"), PropertyInfo(Variant::VECTOR3, "position"), PropertyInfo(Variant::VECTOR3, "normal"), PropertyInfo(Variant::INT, "shape_idx")));
+	GDVIRTUAL_BIND(_input_event, "camera", "event", "position", "normal", "shape_idx");
 
 	ADD_SIGNAL(MethodInfo("input_event", PropertyInfo(Variant::OBJECT, "camera", PROPERTY_HINT_RESOURCE_TYPE, "Node"), PropertyInfo(Variant::OBJECT, "event", PROPERTY_HINT_RESOURCE_TYPE, "InputEvent"), PropertyInfo(Variant::VECTOR3, "position"), PropertyInfo(Variant::VECTOR3, "normal"), PropertyInfo(Variant::INT, "shape_idx")));
 	ADD_SIGNAL(MethodInfo("mouse_entered"));

+ 3 - 1
scene/3d/collision_object_3d.h

@@ -31,6 +31,7 @@
 #ifndef COLLISION_OBJECT_3D_H
 #define COLLISION_OBJECT_3D_H
 
+#include "scene/3d/camera_3d.h"
 #include "scene/3d/node_3d.h"
 
 class CollisionObject3D : public Node3D {
@@ -101,7 +102,7 @@ protected:
 	void _on_transform_changed();
 
 	friend class Viewport;
-	virtual void _input_event(Node *p_camera, const Ref<InputEvent> &p_input_event, const Vector3 &p_pos, const Vector3 &p_normal, int p_shape);
+	virtual void _input_event_call(Camera3D *p_camera, const Ref<InputEvent> &p_input_event, const Vector3 &p_pos, const Vector3 &p_normal, int p_shape);
 	virtual void _mouse_enter();
 	virtual void _mouse_exit();
 
@@ -110,6 +111,7 @@ protected:
 	void set_only_update_transform_changes(bool p_enable);
 	bool is_only_update_transform_changes_enabled() const;
 
+	GDVIRTUAL5(_input_event, Camera3D *, Ref<InputEvent>, Vector3, Vector3, int)
 public:
 	void set_collision_layer(uint32_t p_layer);
 	uint32_t get_collision_layer() const;

+ 2 - 4
scene/gui/base_button.cpp

@@ -52,7 +52,7 @@ void BaseButton::_unpress_group() {
 	}
 }
 
-void BaseButton::_gui_input(Ref<InputEvent> p_event) {
+void BaseButton::gui_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	if (status.disabled) { // no interaction with disabled button
@@ -338,7 +338,7 @@ Ref<Shortcut> BaseButton::get_shortcut() const {
 	return shortcut;
 }
 
-void BaseButton::_unhandled_key_input(Ref<InputEvent> p_event) {
+void BaseButton::unhandled_key_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	if (!_is_focus_owner_in_shorcut_context()) {
@@ -407,8 +407,6 @@ bool BaseButton::_is_focus_owner_in_shorcut_context() const {
 }
 
 void BaseButton::_bind_methods() {
-	ClassDB::bind_method(D_METHOD("_gui_input"), &BaseButton::_gui_input);
-	ClassDB::bind_method(D_METHOD("_unhandled_key_input"), &BaseButton::_unhandled_key_input);
 	ClassDB::bind_method(D_METHOD("set_pressed", "pressed"), &BaseButton::set_pressed);
 	ClassDB::bind_method(D_METHOD("is_pressed"), &BaseButton::is_pressed);
 	ClassDB::bind_method(D_METHOD("set_pressed_no_signal", "pressed"), &BaseButton::set_pressed_no_signal);

+ 2 - 2
scene/gui/base_button.h

@@ -75,8 +75,8 @@ protected:
 	virtual void pressed();
 	virtual void toggled(bool p_pressed);
 	static void _bind_methods();
-	virtual void _gui_input(Ref<InputEvent> p_event);
-	virtual void _unhandled_key_input(Ref<InputEvent> p_event);
+	virtual void gui_input(const Ref<InputEvent> &p_event) override;
+	virtual void unhandled_key_input(const Ref<InputEvent> &p_event) override;
 	void _notification(int p_what);
 
 	bool _is_focus_owner_in_shorcut_context() const;

+ 3 - 3
scene/gui/code_edit.cpp

@@ -248,7 +248,7 @@ void CodeEdit::_notification(int p_what) {
 	}
 }
 
-void CodeEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
+void CodeEdit::gui_input(const Ref<InputEvent> &p_gui_input) {
 	Ref<InputEventMouseButton> mb = p_gui_input;
 
 	if (mb.is_valid()) {
@@ -354,7 +354,7 @@ void CodeEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
 	Ref<InputEventKey> k = p_gui_input;
 	bool update_code_completion = false;
 	if (!k.is_valid()) {
-		TextEdit::_gui_input(p_gui_input);
+		TextEdit::gui_input(p_gui_input);
 		return;
 	}
 
@@ -519,7 +519,7 @@ void CodeEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
 		set_code_hint("");
 	}
 
-	TextEdit::_gui_input(p_gui_input);
+	TextEdit::gui_input(p_gui_input);
 
 	if (update_code_completion) {
 		_filter_code_completion_candidates_impl();

+ 1 - 1
scene/gui/code_edit.h

@@ -248,7 +248,7 @@ private:
 	void _text_changed();
 
 protected:
-	void _gui_input(const Ref<InputEvent> &p_gui_input) override;
+	void gui_input(const Ref<InputEvent> &p_gui_input) override;
 	void _notification(int p_what);
 
 	static void _bind_methods();

+ 20 - 6
scene/gui/control.cpp

@@ -780,6 +780,20 @@ void Control::set_drag_preview(Control *p_control) {
 	get_viewport()->_gui_set_drag_preview(this, p_control);
 }
 
+void Control::_call_gui_input(const Ref<InputEvent> &p_event) {
+	emit_signal(SceneStringNames::get_singleton()->gui_input, p_event); //signal should be first, so it's possible to override an event (and then accept it)
+	if (!is_inside_tree() || get_viewport()->is_input_handled()) {
+		return; //input was handled, abort
+	}
+	GDVIRTUAL_CALL(_gui_input, p_event);
+	if (!is_inside_tree() || get_viewport()->is_input_handled()) {
+		return; //input was handled, abort
+	}
+	gui_input(p_event);
+}
+void Control::gui_input(const Ref<InputEvent> &p_event) {
+}
+
 Size2 Control::get_minimum_size() const {
 	Vector2 ms;
 	if (GDVIRTUAL_CALL(_get_minimum_size, ms)) {
@@ -2798,8 +2812,6 @@ void Control::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_auto_translate", "enable"), &Control::set_auto_translate);
 	ClassDB::bind_method(D_METHOD("is_auto_translating"), &Control::is_auto_translating);
 
-	BIND_VMETHOD(MethodInfo("_gui_input", PropertyInfo(Variant::OBJECT, "event", PROPERTY_HINT_RESOURCE_TYPE, "InputEvent")));
-
 	ADD_GROUP("Anchor", "anchor_");
 	ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "anchor_left", PROPERTY_HINT_RANGE, "0,1,0.001,or_lesser,or_greater"), "_set_anchor", "get_anchor", SIDE_LEFT);
 	ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "anchor_top", PROPERTY_HINT_RANGE, "0,1,0.001,or_lesser,or_greater"), "_set_anchor", "get_anchor", SIDE_TOP);
@@ -2960,8 +2972,10 @@ void Control::_bind_methods() {
 	GDVIRTUAL_BIND(_structured_text_parser, "args", "text");
 	GDVIRTUAL_BIND(_get_minimum_size);
 
-	GDVIRTUAL_BIND(_get_drag_data, "at_position")
-	GDVIRTUAL_BIND(_can_drop_data, "at_position", "data")
-	GDVIRTUAL_BIND(_drop_data, "at_position", "data")
-	GDVIRTUAL_BIND(_make_custom_tooltip, "for_text")
+	GDVIRTUAL_BIND(_get_drag_data, "at_position");
+	GDVIRTUAL_BIND(_can_drop_data, "at_position", "data");
+	GDVIRTUAL_BIND(_drop_data, "at_position", "data");
+	GDVIRTUAL_BIND(_make_custom_tooltip, "for_text");
+
+	GDVIRTUAL_BIND(_gui_input, "event");
 }

+ 16 - 12
scene/gui/control.h

@@ -31,10 +31,10 @@
 #ifndef CONTROL_H
 #define CONTROL_H
 
+#include "core/input/shortcut.h"
 #include "core/math/transform_2d.h"
 #include "core/object/gdvirtual.gen.inc"
 #include "core/templates/rid.h"
-#include "scene/gui/shortcut.h"
 #include "scene/main/canvas_item.h"
 #include "scene/main/node.h"
 #include "scene/main/timer.h"
@@ -263,6 +263,8 @@ private:
 
 	friend class Viewport;
 
+	void _call_gui_input(const Ref<InputEvent> &p_event);
+
 	void _update_minimum_size_cache();
 	friend class Window;
 	static void _propagate_theme_changed(Node *p_at, Control *p_owner, Window *p_owner_window, bool p_assign = true);
@@ -272,17 +274,6 @@ private:
 	static bool has_theme_item_in_types(Control *p_theme_owner, Window *p_theme_owner_window, Theme::DataType p_data_type, const StringName &p_name, List<StringName> p_theme_types);
 	_FORCE_INLINE_ void _get_theme_type_dependencies(const StringName &p_theme_type, List<StringName> *p_list) const;
 
-	GDVIRTUAL1RC(bool, _has_point, Vector2)
-	GDVIRTUAL2RC(Array, _structured_text_parser, Array, String)
-	GDVIRTUAL0RC(Vector2, _get_minimum_size)
-
-	GDVIRTUAL1RC(Variant, _get_drag_data, Vector2)
-	GDVIRTUAL2RC(bool, _can_drop_data, Vector2, Variant)
-	GDVIRTUAL2(_drop_data, Vector2, Variant)
-	GDVIRTUAL1RC(Object *, _make_custom_tooltip, String)
-
-	//GDVIRTUAL1(_gui_input, Ref<InputEvent>)
-
 protected:
 	virtual void add_child_notify(Node *p_child) override;
 	virtual void remove_child_notify(Node *p_child) override;
@@ -301,6 +292,17 @@ protected:
 
 	//bind helpers
 
+	GDVIRTUAL1RC(bool, _has_point, Vector2)
+	GDVIRTUAL2RC(Array, _structured_text_parser, Array, String)
+	GDVIRTUAL0RC(Vector2, _get_minimum_size)
+
+	GDVIRTUAL1RC(Variant, _get_drag_data, Vector2)
+	GDVIRTUAL2RC(bool, _can_drop_data, Vector2, Variant)
+	GDVIRTUAL2(_drop_data, Vector2, Variant)
+	GDVIRTUAL1RC(Object *, _make_custom_tooltip, String)
+
+	GDVIRTUAL1(_gui_input, Ref<InputEvent>)
+
 public:
 	enum {
 		/*		NOTIFICATION_DRAW=30,
@@ -343,6 +345,8 @@ public:
 	virtual Size2 _edit_get_minimum_size() const override;
 #endif
 
+	virtual void gui_input(const Ref<InputEvent> &p_event);
+
 	void accept_event();
 
 	virtual Size2 get_minimum_size() const;

+ 1 - 3
scene/gui/file_dialog.cpp

@@ -95,7 +95,7 @@ void FileDialog::_notification(int p_what) {
 	}
 }
 
-void FileDialog::_unhandled_input(const Ref<InputEvent> &p_event) {
+void FileDialog::unhandled_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	Ref<InputEventKey> k = p_event;
@@ -854,8 +854,6 @@ void FileDialog::_update_drives() {
 bool FileDialog::default_show_hidden_files = false;
 
 void FileDialog::_bind_methods() {
-	ClassDB::bind_method(D_METHOD("_unhandled_input"), &FileDialog::_unhandled_input);
-
 	ClassDB::bind_method(D_METHOD("_cancel_pressed"), &FileDialog::_cancel_pressed);
 
 	ClassDB::bind_method(D_METHOD("clear_filters"), &FileDialog::clear_filters);

+ 1 - 1
scene/gui/file_dialog.h

@@ -132,7 +132,7 @@ private:
 
 	void _update_drives();
 
-	void _unhandled_input(const Ref<InputEvent> &p_event);
+	virtual void unhandled_input(const Ref<InputEvent> &p_event) override;
 
 	bool _is_open_should_be_disabled();
 

+ 1 - 2
scene/gui/gradient_edit.cpp

@@ -88,7 +88,7 @@ void GradientEdit::_show_color_picker() {
 GradientEdit::~GradientEdit() {
 }
 
-void GradientEdit::_gui_input(const Ref<InputEvent> &p_event) {
+void GradientEdit::gui_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	Ref<InputEventKey> k = p_event;
@@ -458,6 +458,5 @@ Vector<Gradient::Point> &GradientEdit::get_points() {
 }
 
 void GradientEdit::_bind_methods() {
-	ClassDB::bind_method(D_METHOD("_gui_input"), &GradientEdit::_gui_input);
 	ADD_SIGNAL(MethodInfo("ramp_changed"));
 }

+ 1 - 1
scene/gui/gradient_edit.h

@@ -52,7 +52,7 @@ class GradientEdit : public Control {
 	void _show_color_picker();
 
 protected:
-	void _gui_input(const Ref<InputEvent> &p_event);
+	virtual void gui_input(const Ref<InputEvent> &p_event) override;
 	void _notification(int p_what);
 	static void _bind_methods();
 

+ 6 - 10
scene/gui/graph_edit.cpp

@@ -51,10 +51,6 @@ GraphEditFilter::GraphEditFilter(GraphEdit *p_edit) {
 	ge = p_edit;
 }
 
-void GraphEditMinimap::_bind_methods() {
-	ClassDB::bind_method(D_METHOD("_gui_input"), &GraphEditMinimap::_gui_input);
-}
-
 GraphEditMinimap::GraphEditMinimap(GraphEdit *p_edit) {
 	ge = p_edit;
 
@@ -148,7 +144,7 @@ Vector2 GraphEditMinimap::_convert_to_graph_position(const Vector2 &p_position)
 	return graph_position;
 }
 
-void GraphEditMinimap::_gui_input(const Ref<InputEvent> &p_ev) {
+void GraphEditMinimap::gui_input(const Ref<InputEvent> &p_ev) {
 	ERR_FAIL_COND(p_ev.is_null());
 
 	if (!ge->is_minimap_enabled()) {
@@ -806,8 +802,9 @@ bool GraphEdit::is_in_hot_zone(const Vector2 &pos, const Vector2 &p_mouse_pos, c
 }
 
 PackedVector2Array GraphEdit::get_connection_line(const Vector2 &p_from, const Vector2 &p_to) {
-	if (get_script_instance() && get_script_instance()->get_script().is_valid() && get_script_instance()->has_method("_get_connection_line")) {
-		return get_script_instance()->call("_get_connection_line", p_from, p_to);
+	Vector<Vector2> ret;
+	if (GDVIRTUAL_CALL(_get_connection_line, p_from, p_to, ret)) {
+		return ret;
 	}
 
 	Curve2D curve;
@@ -1047,7 +1044,7 @@ void GraphEdit::set_selected(Node *p_child) {
 	}
 }
 
-void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) {
+void GraphEdit::gui_input(const Ref<InputEvent> &p_ev) {
 	ERR_FAIL_COND(p_ev.is_null());
 
 	Ref<InputEventMouseMotion> mm = p_ev;
@@ -2191,7 +2188,6 @@ void GraphEdit::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_right_disconnects", "enable"), &GraphEdit::set_right_disconnects);
 	ClassDB::bind_method(D_METHOD("is_right_disconnects_enabled"), &GraphEdit::is_right_disconnects_enabled);
 
-	ClassDB::bind_method(D_METHOD("_gui_input"), &GraphEdit::_gui_input);
 	ClassDB::bind_method(D_METHOD("_update_scroll_offset"), &GraphEdit::_update_scroll_offset);
 
 	ClassDB::bind_method(D_METHOD("get_zoom_hbox"), &GraphEdit::get_zoom_hbox);
@@ -2200,7 +2196,7 @@ void GraphEdit::_bind_methods() {
 
 	ClassDB::bind_method(D_METHOD("set_selected", "node"), &GraphEdit::set_selected);
 
-	BIND_VMETHOD(MethodInfo(Variant::PACKED_VECTOR2_ARRAY, "_get_connection_line", PropertyInfo(Variant::VECTOR2, "from"), PropertyInfo(Variant::VECTOR2, "to")));
+	GDVIRTUAL_BIND(_get_connection_line, "from", "to")
 
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "right_disconnects"), "set_right_disconnects", "is_right_disconnects_enabled");
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "scroll_offset"), "set_scroll_ofs", "get_scroll_ofs");

+ 4 - 4
scene/gui/graph_edit.h

@@ -62,8 +62,6 @@ class GraphEditMinimap : public Control {
 	GraphEdit *ge;
 
 protected:
-	static void _bind_methods();
-
 public:
 	GraphEditMinimap(GraphEdit *p_edit);
 
@@ -88,7 +86,7 @@ private:
 	Vector2 _convert_from_graph_position(const Vector2 &p_position);
 	Vector2 _convert_to_graph_position(const Vector2 &p_position);
 
-	void _gui_input(const Ref<InputEvent> &p_ev);
+	virtual void gui_input(const Ref<InputEvent> &p_ev) override;
 
 	void _adjust_graph_scroll(const Vector2 &p_offset);
 };
@@ -178,7 +176,7 @@ private:
 
 	void _update_scroll();
 	void _scroll_moved(double);
-	void _gui_input(const Ref<InputEvent> &p_ev);
+	virtual void gui_input(const Ref<InputEvent> &p_ev) override;
 
 	Control *connections_layer;
 	GraphEditFilter *top_layer;
@@ -255,6 +253,8 @@ protected:
 	virtual void remove_child_notify(Node *p_child) override;
 	void _notification(int p_what);
 
+	GDVIRTUAL2RC(Vector<Vector2>, _get_connection_line, Vector2, Vector2)
+
 public:
 	Error connect_node(const StringName &p_from, int p_from_port, const StringName &p_to, int p_to_port);
 	bool is_node_connected(const StringName &p_from, int p_from_port, const StringName &p_to, int p_to_port);

+ 1 - 3
scene/gui/graph_node.cpp

@@ -863,7 +863,7 @@ Color GraphNode::get_connection_output_color(int p_idx) {
 	return conn_output_cache[p_idx].color;
 }
 
-void GraphNode::_gui_input(const Ref<InputEvent> &p_ev) {
+void GraphNode::gui_input(const Ref<InputEvent> &p_ev) {
 	ERR_FAIL_COND(p_ev.is_null());
 
 	Ref<InputEventMouseButton> mb = p_ev;
@@ -946,8 +946,6 @@ void GraphNode::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_language", "language"), &GraphNode::set_language);
 	ClassDB::bind_method(D_METHOD("get_language"), &GraphNode::get_language);
 
-	ClassDB::bind_method(D_METHOD("_gui_input"), &GraphNode::_gui_input);
-
 	ClassDB::bind_method(D_METHOD("set_slot", "idx", "enable_left", "type_left", "color_left", "enable_right", "type_right", "color_right", "custom_left", "custom_right"), &GraphNode::set_slot, DEFVAL(Ref<Texture2D>()), DEFVAL(Ref<Texture2D>()));
 	ClassDB::bind_method(D_METHOD("clear_slot", "idx"), &GraphNode::clear_slot);
 	ClassDB::bind_method(D_METHOD("clear_all_slots"), &GraphNode::clear_all_slots);

+ 1 - 1
scene/gui/graph_node.h

@@ -99,7 +99,7 @@ private:
 	Overlay overlay = OVERLAY_DISABLED;
 
 protected:
-	void _gui_input(const Ref<InputEvent> &p_ev);
+	virtual void gui_input(const Ref<InputEvent> &p_ev) override;
 	void _notification(int p_what);
 	static void _bind_methods();
 

+ 1 - 3
scene/gui/item_list.cpp

@@ -537,7 +537,7 @@ Size2 ItemList::Item::get_icon_size() const {
 	return size_result;
 }
 
-void ItemList::_gui_input(const Ref<InputEvent> &p_event) {
+void ItemList::gui_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	double prev_scroll = scroll_bar->get_value();
@@ -1614,8 +1614,6 @@ void ItemList::_bind_methods() {
 
 	ClassDB::bind_method(D_METHOD("get_v_scroll"), &ItemList::get_v_scroll);
 
-	ClassDB::bind_method(D_METHOD("_gui_input"), &ItemList::_gui_input);
-
 	ClassDB::bind_method(D_METHOD("_set_items"), &ItemList::_set_items);
 	ClassDB::bind_method(D_METHOD("_get_items"), &ItemList::_get_items);
 

+ 2 - 1
scene/gui/item_list.h

@@ -123,7 +123,6 @@ private:
 	void _set_items(const Array &p_items);
 
 	void _scroll_changed(double);
-	void _gui_input(const Ref<InputEvent> &p_event);
 	void _shape(int p_idx);
 
 protected:
@@ -131,6 +130,8 @@ protected:
 	static void _bind_methods();
 
 public:
+	virtual void gui_input(const Ref<InputEvent> &p_event) override;
+
 	int add_item(const String &p_item, const Ref<Texture2D> &p_texture = Ref<Texture2D>(), bool p_selectable = true);
 	int add_icon_item(const Ref<Texture2D> &p_item, bool p_selectable = true);
 

+ 1 - 2
scene/gui/line_edit.cpp

@@ -216,7 +216,7 @@ void LineEdit::_delete(bool p_word, bool p_all_to_right) {
 	}
 }
 
-void LineEdit::_gui_input(Ref<InputEvent> p_event) {
+void LineEdit::gui_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
 	Ref<InputEventMouseButton> b = p_event;
@@ -2084,7 +2084,6 @@ void LineEdit::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_align", "align"), &LineEdit::set_align);
 	ClassDB::bind_method(D_METHOD("get_align"), &LineEdit::get_align);
 
-	ClassDB::bind_method(D_METHOD("_gui_input"), &LineEdit::_gui_input);
 	ClassDB::bind_method(D_METHOD("clear"), &LineEdit::clear);
 	ClassDB::bind_method(D_METHOD("select", "from", "to"), &LineEdit::select, DEFVAL(0), DEFVAL(-1));
 	ClassDB::bind_method(D_METHOD("select_all"), &LineEdit::select_all);

+ 1 - 1
scene/gui/line_edit.h

@@ -202,7 +202,7 @@ private:
 protected:
 	void _notification(int p_what);
 	static void _bind_methods();
-	void _gui_input(Ref<InputEvent> p_event);
+	virtual void gui_input(const Ref<InputEvent> &p_event) override;
 
 	bool _set(const StringName &p_name, const Variant &p_value);
 	bool _get(const StringName &p_name, Variant &r_ret) const;

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác