fix focus system
This commit is contained in:
parent
f3f2c5077b
commit
38774b6195
|
@ -141,7 +141,8 @@ Thus I've decided to use a custom event system that is similar to the one used i
|
||||||
| -- | -- |
|
| -- | -- |
|
||||||
| `entity` | Marks the object as being an entity placed in space |
|
| `entity` | Marks the object as being an entity placed in space |
|
||||||
| `ui_focus` | The element can be focused, can be a parent |
|
| `ui_focus` | The element can be focused, can be a parent |
|
||||||
| `ui_focus_skip` | The focus will not be reset. Useful for keyboard |
|
| `ui_focus_skip` | Focus checking on this element will be skipped |
|
||||||
|
| `ui_focus_stop` | The focus will not be reset. Useful for keyboard |
|
||||||
|
|
||||||
|
|
||||||
### Functions
|
### Functions
|
||||||
|
|
|
@ -23,10 +23,10 @@ var grabbed_right = false
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
touch = Touch.new({
|
touch = Touch.new({
|
||||||
Finger.Type.INDEX_RIGHT: $XRHandRight/IndexTip/IndexArea,
|
Finger.Type.INDEX_RIGHT: $XRHandRight/IndexTip/TouchArea,
|
||||||
Finger.Type.INDEX_LEFT: $XRHandLeft/IndexTip/IndexArea,
|
Finger.Type.INDEX_LEFT: $XRHandLeft/IndexTip/TouchArea,
|
||||||
Finger.Type.MIDDLE_RIGHT: $XRHandRight/MiddleTip/MiddleArea,
|
Finger.Type.MIDDLE_RIGHT: $XRHandRight/MiddleTip/TouchArea,
|
||||||
Finger.Type.MIDDLE_LEFT: $XRHandLeft/MiddleTip/MiddleArea
|
Finger.Type.MIDDLE_LEFT: $XRHandLeft/MiddleTip/TouchArea
|
||||||
})
|
})
|
||||||
add_child(touch)
|
add_child(touch)
|
||||||
|
|
||||||
|
|
|
@ -28,13 +28,13 @@ external_skeleton = NodePath("../left_hand/Armature_001/Skeleton3D")
|
||||||
[node name="Marker3D" type="Marker3D" parent="XRHandLeft/IndexTip"]
|
[node name="Marker3D" type="Marker3D" parent="XRHandLeft/IndexTip"]
|
||||||
gizmo_extents = 0.02
|
gizmo_extents = 0.02
|
||||||
|
|
||||||
[node name="IndexArea" type="Area3D" parent="XRHandLeft/IndexTip"]
|
[node name="TouchArea" type="Area3D" parent="XRHandLeft/IndexTip"]
|
||||||
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0.01)
|
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0.01)
|
||||||
collision_layer = 2
|
collision_layer = 2
|
||||||
collision_mask = 2
|
collision_mask = 2
|
||||||
monitorable = false
|
monitorable = false
|
||||||
|
|
||||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="XRHandLeft/IndexTip/IndexArea"]
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="XRHandLeft/IndexTip/TouchArea"]
|
||||||
transform = Transform3D(1, -7.45058e-09, -2.22045e-16, 7.45058e-09, 1, 0, 0, 0, 1, 0, 0, 0)
|
transform = Transform3D(1, -7.45058e-09, -2.22045e-16, 7.45058e-09, 1, 0, 0, 0, 1, 0, 0, 0)
|
||||||
shape = SubResource("CapsuleShape3D_dopke")
|
shape = SubResource("CapsuleShape3D_dopke")
|
||||||
|
|
||||||
|
@ -58,13 +58,13 @@ external_skeleton = NodePath("../left_hand/Armature_001/Skeleton3D")
|
||||||
[node name="Marker3D" type="Marker3D" parent="XRHandLeft/MiddleTip"]
|
[node name="Marker3D" type="Marker3D" parent="XRHandLeft/MiddleTip"]
|
||||||
gizmo_extents = 0.02
|
gizmo_extents = 0.02
|
||||||
|
|
||||||
[node name="IndexArea" type="Area3D" parent="XRHandLeft/MiddleTip"]
|
[node name="TouchArea" type="Area3D" parent="XRHandLeft/MiddleTip"]
|
||||||
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0.01)
|
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0.01)
|
||||||
collision_layer = 2
|
collision_layer = 2
|
||||||
collision_mask = 2
|
collision_mask = 2
|
||||||
monitorable = false
|
monitorable = false
|
||||||
|
|
||||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="XRHandLeft/MiddleTip/IndexArea"]
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="XRHandLeft/MiddleTip/TouchArea"]
|
||||||
transform = Transform3D(1, -7.45058e-09, -2.22045e-16, 7.45058e-09, 1, 0, 0, 0, 1, 0, 0, 0)
|
transform = Transform3D(1, -7.45058e-09, -2.22045e-16, 7.45058e-09, 1, 0, 0, 0, 1, 0, 0, 0)
|
||||||
shape = SubResource("CapsuleShape3D_dopke")
|
shape = SubResource("CapsuleShape3D_dopke")
|
||||||
|
|
||||||
|
@ -86,13 +86,13 @@ external_skeleton = NodePath("../right_hand/Armature/Skeleton3D")
|
||||||
[node name="Marker3D" type="Marker3D" parent="XRHandRight/IndexTip"]
|
[node name="Marker3D" type="Marker3D" parent="XRHandRight/IndexTip"]
|
||||||
gizmo_extents = 0.02
|
gizmo_extents = 0.02
|
||||||
|
|
||||||
[node name="IndexArea" type="Area3D" parent="XRHandRight/IndexTip"]
|
[node name="TouchArea" type="Area3D" parent="XRHandRight/IndexTip"]
|
||||||
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0.01)
|
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0.01)
|
||||||
collision_layer = 2
|
collision_layer = 2
|
||||||
collision_mask = 2
|
collision_mask = 2
|
||||||
monitorable = false
|
monitorable = false
|
||||||
|
|
||||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="XRHandRight/IndexTip/IndexArea"]
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="XRHandRight/IndexTip/TouchArea"]
|
||||||
transform = Transform3D(1, -7.45058e-09, -2.22045e-16, 7.45058e-09, 1, 0, 0, 0, 1, 0, 0, 0)
|
transform = Transform3D(1, -7.45058e-09, -2.22045e-16, 7.45058e-09, 1, 0, 0, 0, 1, 0, 0, 0)
|
||||||
shape = SubResource("CapsuleShape3D_dopke")
|
shape = SubResource("CapsuleShape3D_dopke")
|
||||||
|
|
||||||
|
@ -116,13 +116,13 @@ external_skeleton = NodePath("../right_hand/Armature/Skeleton3D")
|
||||||
[node name="Marker3D" type="Marker3D" parent="XRHandRight/MiddleTip"]
|
[node name="Marker3D" type="Marker3D" parent="XRHandRight/MiddleTip"]
|
||||||
gizmo_extents = 0.02
|
gizmo_extents = 0.02
|
||||||
|
|
||||||
[node name="IndexArea" type="Area3D" parent="XRHandRight/MiddleTip"]
|
[node name="TouchArea" type="Area3D" parent="XRHandRight/MiddleTip"]
|
||||||
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0.01)
|
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0.01)
|
||||||
collision_layer = 2
|
collision_layer = 2
|
||||||
collision_mask = 2
|
collision_mask = 2
|
||||||
monitorable = false
|
monitorable = false
|
||||||
|
|
||||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="XRHandRight/MiddleTip/IndexArea"]
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="XRHandRight/MiddleTip/TouchArea"]
|
||||||
transform = Transform3D(1, -7.45058e-09, -2.22045e-16, 7.45058e-09, 1, 0, 0, 0, 1, 0, 0, 0)
|
transform = Transform3D(1, -7.45058e-09, -2.22045e-16, 7.45058e-09, 1, 0, 0, 0, 1, 0, 0, 0)
|
||||||
shape = SubResource("CapsuleShape3D_dopke")
|
shape = SubResource("CapsuleShape3D_dopke")
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ size = Vector3(0.79, 0.01, 0.26)
|
||||||
[sub_resource type="BoxMesh" id="BoxMesh_7rntc"]
|
[sub_resource type="BoxMesh" id="BoxMesh_7rntc"]
|
||||||
size = Vector3(0.79, 0.01, 0.26)
|
size = Vector3(0.79, 0.01, 0.26)
|
||||||
|
|
||||||
[node name="Keyboard" type="StaticBody3D" groups=["ui_focus_skip"]]
|
[node name="Keyboard" type="StaticBody3D" groups=["ui_focus_stop"]]
|
||||||
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0)
|
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0, 0)
|
||||||
script = ExtResource("1_maojw")
|
script = ExtResource("1_maojw")
|
||||||
|
|
||||||
|
|
|
@ -16,11 +16,10 @@ const IconFont = preload("res://assets/icons/icons.tres")
|
||||||
@export var focusable: bool = true:
|
@export var focusable: bool = true:
|
||||||
set(value):
|
set(value):
|
||||||
focusable = value
|
focusable = value
|
||||||
if !is_node_ready(): await ready
|
if value == false:
|
||||||
if value:
|
add_to_group("ui_focus_stop")
|
||||||
add_to_group("ui_focus_skip")
|
|
||||||
else:
|
else:
|
||||||
remove_from_group("ui_focus_skip")
|
remove_from_group("ui_focus_stop")
|
||||||
|
|
||||||
@export var font_size: int = 10:
|
@export var font_size: int = 10:
|
||||||
set(value):
|
set(value):
|
||||||
|
|
|
@ -73,10 +73,9 @@ size = Vector3(0.0501598, 0.0195937, 0.0501598)
|
||||||
|
|
||||||
[node name="Button" type="Node3D" groups=["ui_focus"]]
|
[node name="Button" type="Node3D" groups=["ui_focus"]]
|
||||||
script = ExtResource("1_74x7g")
|
script = ExtResource("1_74x7g")
|
||||||
focusable = null
|
|
||||||
label = "Example Text"
|
label = "Example Text"
|
||||||
|
|
||||||
[node name="Body" type="StaticBody3D" parent="."]
|
[node name="Body" type="StaticBody3D" parent="." groups=["ui_focus_skip"]]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.01, 0)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.01, 0)
|
||||||
|
|
||||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="Body"]
|
[node name="MeshInstance3D" type="MeshInstance3D" parent="Body"]
|
||||||
|
|
|
@ -115,6 +115,7 @@ func update_caret_position(event):
|
||||||
|
|
||||||
|
|
||||||
func _on_focus_out(_event):
|
func _on_focus_out(_event):
|
||||||
|
print("focus out")
|
||||||
animation.stop()
|
animation.stop()
|
||||||
caret.hide()
|
caret.hide()
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
[gd_scene load_steps=12 format=3 uid="uid://c3kdssrmv84kv"]
|
[gd_scene load_steps=13 format=3 uid="uid://c3kdssrmv84kv"]
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://content/ui/menu/menu.gd" id="1_ng4u3"]
|
[ext_resource type="Script" path="res://content/ui/menu/menu.gd" id="1_ng4u3"]
|
||||||
[ext_resource type="PackedScene" uid="uid://crrb0l3ekuotj" path="res://content/ui/menu/edit/edit_menu.tscn" id="4_r2raj"]
|
[ext_resource type="PackedScene" uid="uid://crrb0l3ekuotj" path="res://content/ui/menu/edit/edit_menu.tscn" id="4_r2raj"]
|
||||||
|
@ -13,6 +13,9 @@
|
||||||
material = SubResource("StandardMaterial3D_ti5t2")
|
material = SubResource("StandardMaterial3D_ti5t2")
|
||||||
size = Vector3(0.3, 0.01, 0.3)
|
size = Vector3(0.3, 0.01, 0.3)
|
||||||
|
|
||||||
|
[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_mgnm0"]
|
||||||
|
points = PackedVector3Array(-0.15, -0.005, -0.15, -0.15, 0.005, -0.15, 0.15, -0.005, -0.15, -0.15, -0.005, 0.15, -0.15, 0.005, 0.15, 0.15, 0.005, -0.15, 0.15, -0.005, 0.15, 0.15, 0.005, 0.15)
|
||||||
|
|
||||||
[sub_resource type="Animation" id="Animation_61md4"]
|
[sub_resource type="Animation" id="Animation_61md4"]
|
||||||
length = 0.001
|
length = 0.001
|
||||||
tracks/0/type = "bezier"
|
tracks/0/type = "bezier"
|
||||||
|
@ -153,47 +156,46 @@ _data = {
|
||||||
[node name="Menu" type="Node3D"]
|
[node name="Menu" type="Node3D"]
|
||||||
script = ExtResource("1_ng4u3")
|
script = ExtResource("1_ng4u3")
|
||||||
|
|
||||||
[node name="AnimationContainer" type="Node3D" parent="."]
|
[node name="AnimationContainer" type="StaticBody3D" parent="."]
|
||||||
|
|
||||||
[node name="Background" type="MeshInstance3D" parent="AnimationContainer"]
|
[node name="Background" type="MeshInstance3D" parent="AnimationContainer"]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.21, 0, 0.15)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.21, 0, 0.15)
|
||||||
mesh = SubResource("BoxMesh_08du6")
|
mesh = SubResource("BoxMesh_08du6")
|
||||||
skeleton = NodePath("../..")
|
skeleton = NodePath("../..")
|
||||||
|
|
||||||
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="AnimationContainer"]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.21, 0, 0.15)
|
||||||
|
shape = SubResource("ConvexPolygonShape3D_mgnm0")
|
||||||
|
|
||||||
[node name="Navigation" type="Node3D" parent="AnimationContainer"]
|
[node name="Navigation" type="Node3D" parent="AnimationContainer"]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.06, 0, 0)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.06, 0, 0)
|
||||||
|
|
||||||
[node name="View" parent="AnimationContainer/Navigation" instance=ExtResource("5_w4i01")]
|
[node name="View" parent="AnimationContainer/Navigation" instance=ExtResource("5_w4i01")]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.03)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.03)
|
||||||
focusable = true
|
|
||||||
label = "visibility"
|
label = "visibility"
|
||||||
icon = true
|
icon = true
|
||||||
toggleable = true
|
toggleable = true
|
||||||
|
|
||||||
[node name="Edit" parent="AnimationContainer/Navigation" instance=ExtResource("5_w4i01")]
|
[node name="Edit" parent="AnimationContainer/Navigation" instance=ExtResource("5_w4i01")]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.09)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.09)
|
||||||
focusable = true
|
|
||||||
label = "widgets"
|
label = "widgets"
|
||||||
icon = true
|
icon = true
|
||||||
toggleable = true
|
toggleable = true
|
||||||
|
|
||||||
[node name="Room" parent="AnimationContainer/Navigation" instance=ExtResource("5_w4i01")]
|
[node name="Room" parent="AnimationContainer/Navigation" instance=ExtResource("5_w4i01")]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.15)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.15)
|
||||||
focusable = true
|
|
||||||
label = "view_in_ar"
|
label = "view_in_ar"
|
||||||
icon = true
|
icon = true
|
||||||
toggleable = true
|
toggleable = true
|
||||||
|
|
||||||
[node name="Automate" parent="AnimationContainer/Navigation" instance=ExtResource("5_w4i01")]
|
[node name="Automate" parent="AnimationContainer/Navigation" instance=ExtResource("5_w4i01")]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.21)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.21)
|
||||||
focusable = true
|
|
||||||
label = "schema"
|
label = "schema"
|
||||||
icon = true
|
icon = true
|
||||||
toggleable = true
|
toggleable = true
|
||||||
|
|
||||||
[node name="Settings" parent="AnimationContainer/Navigation" instance=ExtResource("5_w4i01")]
|
[node name="Settings" parent="AnimationContainer/Navigation" instance=ExtResource("5_w4i01")]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.27)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.03, 0, 0.27)
|
||||||
focusable = true
|
|
||||||
label = "settings"
|
label = "settings"
|
||||||
icon = true
|
icon = true
|
||||||
toggleable = true
|
toggleable = true
|
||||||
|
|
|
@ -32,7 +32,6 @@ outline_size = 0
|
||||||
|
|
||||||
[node name="Button" parent="Content" instance=ExtResource("1_faxng")]
|
[node name="Button" parent="Content" instance=ExtResource("1_faxng")]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0458097, 0, 0.253575)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0458097, 0, 0.253575)
|
||||||
focusable = true
|
|
||||||
label = "sports_basketball"
|
label = "sports_basketball"
|
||||||
icon = true
|
icon = true
|
||||||
|
|
||||||
|
@ -85,7 +84,6 @@ horizontal_alignment = 0
|
||||||
|
|
||||||
[node name="Connect" parent="Content" instance=ExtResource("1_faxng")]
|
[node name="Connect" parent="Content" instance=ExtResource("1_faxng")]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.25, 0, 0.12)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.25, 0, 0.12)
|
||||||
focusable = true
|
|
||||||
label = "wifi"
|
label = "wifi"
|
||||||
icon = true
|
icon = true
|
||||||
|
|
||||||
|
|
|
@ -35,11 +35,14 @@ func emit(type: String, event: Event):
|
||||||
func is_focused(node: Node):
|
func is_focused(node: Node):
|
||||||
return _active_node == node
|
return _active_node == node
|
||||||
|
|
||||||
func _handle_focus(event: EventBubble):
|
func _handle_focus(target: Variant, event: EventBubble):
|
||||||
var target = event.target
|
print("focus ", target, " ", target.get_groups(), " ", event)
|
||||||
|
|
||||||
if target != null && target.is_in_group("ui_focus_skip"):
|
if target != null:
|
||||||
return
|
if target.is_in_group("ui_focus_skip"):
|
||||||
|
return false
|
||||||
|
if target.is_in_group("ui_focus_stop"):
|
||||||
|
return true
|
||||||
|
|
||||||
var event_focus = EventFocus.new()
|
var event_focus = EventFocus.new()
|
||||||
event_focus.previous_target = _active_node
|
event_focus.previous_target = _active_node
|
||||||
|
@ -51,15 +54,19 @@ func _handle_focus(event: EventBubble):
|
||||||
|
|
||||||
if target == null || target.is_in_group("ui_focus") == false:
|
if target == null || target.is_in_group("ui_focus") == false:
|
||||||
_active_node = null
|
_active_node = null
|
||||||
return
|
return false
|
||||||
|
|
||||||
_active_node = target
|
_active_node = target
|
||||||
|
|
||||||
|
print("focus", _active_node )
|
||||||
|
|
||||||
if _active_node != null && _active_node.has_method(FN_PREFIX + "focus_in"):
|
if _active_node != null && _active_node.has_method(FN_PREFIX + "focus_in"):
|
||||||
_active_node.call(FN_PREFIX + "focus_in", event_focus)
|
_active_node.call(FN_PREFIX + "focus_in", event_focus)
|
||||||
on_focus_in.emit(event_focus)
|
on_focus_in.emit(event_focus)
|
||||||
|
|
||||||
func _bubble_call(type: String, target: Variant, event: EventBubble):
|
return true
|
||||||
|
|
||||||
|
func _bubble_call(type: String, target: Variant, event: EventBubble, focused = false):
|
||||||
if target == null:
|
if target == null:
|
||||||
return false
|
return false
|
||||||
|
|
||||||
|
@ -73,8 +80,8 @@ func _bubble_call(type: String, target: Variant, event: EventBubble):
|
||||||
if event.bubbling == false:
|
if event.bubbling == false:
|
||||||
return false
|
return false
|
||||||
|
|
||||||
if type == "press_down" || type == "touch_enter":
|
if (type == "press_down" || type == "touch_enter") && focused == false:
|
||||||
_handle_focus(event)
|
focused = _handle_focus(target, event)
|
||||||
|
|
||||||
for child in target.get_children():
|
for child in target.get_children():
|
||||||
if child is Function && child.has_method(FN_PREFIX + type):
|
if child is Function && child.has_method(FN_PREFIX + type):
|
||||||
|
@ -83,7 +90,7 @@ func _bubble_call(type: String, target: Variant, event: EventBubble):
|
||||||
var parent = target.get_parent()
|
var parent = target.get_parent()
|
||||||
|
|
||||||
if parent != null && parent is Node:
|
if parent != null && parent is Node:
|
||||||
_bubble_call(type, parent, event)
|
_bubble_call(type, parent, event, focused)
|
||||||
else:
|
else:
|
||||||
# in case the top has been reached
|
# in case the top has been reached
|
||||||
_root_call(type, event)
|
_root_call(type, event)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user