summaryrefslogtreecommitdiffstats
path: root/scene/gui/control.cpp
diff options
context:
space:
mode:
authorRémi Verschelde <remi@verschelde.fr>2023-05-16 00:31:56 +0200
committerGitHub <noreply@github.com>2023-05-16 00:31:56 +0200
commit8cfa19a078ecc7c5690740a8c669d1ecbd04bb0c (patch)
tree5d5e16393bbca27a0d79835c3e09b15ae6cae937 /scene/gui/control.cpp
parent313f613352960b4d1455f0e179315de5e582b6ea (diff)
parent0a9f72d5a80c8957ef5172f546c9076089862cef (diff)
downloadredot-engine-8cfa19a078ecc7c5690740a8c669d1ecbd04bb0c.tar.gz
Merge pull request #77000 from reduz/make-more-base-nodes-thread-safe
Make more base nodes thread safe
Diffstat (limited to 'scene/gui/control.cpp')
-rw-r--r--scene/gui/control.cpp157
1 files changed, 157 insertions, 0 deletions
diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp
index 6ef39c88d8..39bfa556e5 100644
--- a/scene/gui/control.cpp
+++ b/scene/gui/control.cpp
@@ -187,6 +187,7 @@ Size2 Control::_edit_get_minimum_size() const {
#endif
void Control::reparent(Node *p_parent, bool p_keep_global_transform) {
+ ERR_MAIN_THREAD_GUARD;
Transform2D temp = get_global_transform();
Node::reparent(p_parent);
if (p_keep_global_transform) {
@@ -197,6 +198,7 @@ void Control::reparent(Node *p_parent, bool p_keep_global_transform) {
// Editor integration.
void Control::get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const {
+ ERR_READ_THREAD_GUARD;
Node::get_argument_options(p_function, p_idx, r_options);
if (p_idx == 0) {
@@ -222,6 +224,7 @@ void Control::get_argument_options(const StringName &p_function, int p_idx, List
}
PackedStringArray Control::get_configuration_warnings() const {
+ ERR_READ_THREAD_GUARD_V(PackedStringArray());
PackedStringArray warnings = Node::get_configuration_warnings();
if (data.mouse_filter == MOUSE_FILTER_IGNORE && !data.tooltip.is_empty()) {
@@ -236,6 +239,7 @@ PackedStringArray Control::get_configuration_warnings() const {
}
bool Control::is_text_field() const {
+ ERR_READ_THREAD_GUARD_V(false);
return false;
}
@@ -257,6 +261,7 @@ String Control::properties_managed_by_container[] = {
};
bool Control::_set(const StringName &p_name, const Variant &p_value) {
+ ERR_MAIN_THREAD_GUARD_V(false);
String name = p_name;
if (!name.begins_with("theme_override")) {
return false;
@@ -327,6 +332,7 @@ bool Control::_set(const StringName &p_name, const Variant &p_value) {
}
bool Control::_get(const StringName &p_name, Variant &r_ret) const {
+ ERR_MAIN_THREAD_GUARD_V(false);
String sname = p_name;
if (!sname.begins_with("theme_override")) {
return false;
@@ -358,6 +364,7 @@ bool Control::_get(const StringName &p_name, Variant &r_ret) const {
}
void Control::_get_property_list(List<PropertyInfo> *p_list) const {
+ ERR_MAIN_THREAD_GUARD;
Ref<Theme> default_theme = ThemeDB::get_singleton()->get_default_theme();
p_list->push_back(PropertyInfo(Variant::NIL, GNAME("Theme Overrides", "theme_override_"), PROPERTY_HINT_NONE, "theme_override_", PROPERTY_USAGE_GROUP));
@@ -603,18 +610,22 @@ bool Control::_property_get_revert(const StringName &p_name, Variant &r_property
// Global relations.
bool Control::is_top_level_control() const {
+ ERR_READ_THREAD_GUARD_V(false);
return is_inside_tree() && (!data.parent_canvas_item && !data.RI && is_set_as_top_level());
}
Control *Control::get_parent_control() const {
+ ERR_READ_THREAD_GUARD_V(nullptr);
return data.parent_control;
}
Window *Control::get_parent_window() const {
+ ERR_READ_THREAD_GUARD_V(nullptr);
return data.parent_window;
}
Control *Control::get_root_parent_control() const {
+ ERR_READ_THREAD_GUARD_V(nullptr);
const CanvasItem *ci = this;
const Control *root = this;
@@ -635,6 +646,7 @@ Control *Control::get_root_parent_control() const {
}
Rect2 Control::get_parent_anchorable_rect() const {
+ ERR_READ_THREAD_GUARD_V(Rect2());
if (!is_inside_tree()) {
return Rect2();
}
@@ -662,6 +674,7 @@ Rect2 Control::get_parent_anchorable_rect() const {
}
Size2 Control::get_parent_area_size() const {
+ ERR_READ_THREAD_GUARD_V(Size2());
return get_parent_anchorable_rect().size;
}
@@ -689,6 +702,7 @@ void Control::_update_canvas_item_transform() {
}
Transform2D Control::get_transform() const {
+ ERR_READ_THREAD_GUARD_V(Transform2D());
Transform2D xform = _get_internal_transform();
xform[2] += get_position();
return xform;
@@ -707,6 +721,7 @@ void Control::_set_anchor(Side p_side, real_t p_anchor) {
}
void Control::set_anchor(Side p_side, real_t p_anchor, bool p_keep_offset, bool p_push_opposite_anchor) {
+ ERR_MAIN_THREAD_GUARD;
ERR_FAIL_INDEX((int)p_side, 4);
Rect2 parent_rect = get_parent_anchorable_rect();
@@ -739,12 +754,14 @@ void Control::set_anchor(Side p_side, real_t p_anchor, bool p_keep_offset, bool
}
real_t Control::get_anchor(Side p_side) const {
+ ERR_READ_THREAD_GUARD_V(0);
ERR_FAIL_INDEX_V(int(p_side), 4, 0.0);
return data.anchor[p_side];
}
void Control::set_offset(Side p_side, real_t p_value) {
+ ERR_MAIN_THREAD_GUARD;
ERR_FAIL_INDEX((int)p_side, 4);
if (data.offset[p_side] == p_value) {
return;
@@ -755,17 +772,20 @@ void Control::set_offset(Side p_side, real_t p_value) {
}
real_t Control::get_offset(Side p_side) const {
+ ERR_READ_THREAD_GUARD_V(0);
ERR_FAIL_INDEX_V((int)p_side, 4, 0);
return data.offset[p_side];
}
void Control::set_anchor_and_offset(Side p_side, real_t p_anchor, real_t p_pos, bool p_push_opposite_anchor) {
+ ERR_MAIN_THREAD_GUARD;
set_anchor(p_side, p_anchor, false, p_push_opposite_anchor);
set_offset(p_side, p_pos);
}
void Control::set_begin(const Point2 &p_point) {
+ ERR_MAIN_THREAD_GUARD;
ERR_FAIL_COND(!isfinite(p_point.x) || !isfinite(p_point.y));
if (data.offset[0] == p_point.x && data.offset[1] == p_point.y) {
return;
@@ -777,10 +797,12 @@ void Control::set_begin(const Point2 &p_point) {
}
Point2 Control::get_begin() const {
+ ERR_READ_THREAD_GUARD_V(Vector2());
return Point2(data.offset[0], data.offset[1]);
}
void Control::set_end(const Point2 &p_point) {
+ ERR_MAIN_THREAD_GUARD;
if (data.offset[2] == p_point.x && data.offset[3] == p_point.y) {
return;
}
@@ -791,10 +813,12 @@ void Control::set_end(const Point2 &p_point) {
}
Point2 Control::get_end() const {
+ ERR_READ_THREAD_GUARD_V(Point2());
return Point2(data.offset[2], data.offset[3]);
}
void Control::set_h_grow_direction(GrowDirection p_direction) {
+ ERR_MAIN_THREAD_GUARD;
if (data.h_grow == p_direction) {
return;
}
@@ -806,10 +830,12 @@ void Control::set_h_grow_direction(GrowDirection p_direction) {
}
Control::GrowDirection Control::get_h_grow_direction() const {
+ ERR_READ_THREAD_GUARD_V(GROW_DIRECTION_BEGIN);
return data.h_grow;
}
void Control::set_v_grow_direction(GrowDirection p_direction) {
+ ERR_MAIN_THREAD_GUARD;
if (data.v_grow == p_direction) {
return;
}
@@ -821,6 +847,7 @@ void Control::set_v_grow_direction(GrowDirection p_direction) {
}
Control::GrowDirection Control::get_v_grow_direction() const {
+ ERR_READ_THREAD_GUARD_V(GROW_DIRECTION_BEGIN);
return data.v_grow;
}
@@ -1045,6 +1072,7 @@ int Control::_get_anchors_layout_preset() const {
}
void Control::set_anchors_preset(LayoutPreset p_preset, bool p_keep_offsets) {
+ ERR_MAIN_THREAD_GUARD;
ERR_FAIL_INDEX((int)p_preset, 16);
//Left
@@ -1161,6 +1189,7 @@ void Control::set_anchors_preset(LayoutPreset p_preset, bool p_keep_offsets) {
}
void Control::set_offsets_preset(LayoutPreset p_preset, LayoutPresetMode p_resize_mode, int p_margin) {
+ ERR_MAIN_THREAD_GUARD;
ERR_FAIL_INDEX((int)p_preset, 16);
ERR_FAIL_INDEX((int)p_resize_mode, 4);
@@ -1296,11 +1325,13 @@ void Control::set_offsets_preset(LayoutPreset p_preset, LayoutPresetMode p_resiz
}
void Control::set_anchors_and_offsets_preset(LayoutPreset p_preset, LayoutPresetMode p_resize_mode, int p_margin) {
+ ERR_MAIN_THREAD_GUARD;
set_anchors_preset(p_preset);
set_offsets_preset(p_preset, p_resize_mode, p_margin);
}
void Control::set_grow_direction_preset(LayoutPreset p_preset) {
+ ERR_MAIN_THREAD_GUARD;
// Select correct horizontal grow direction.
switch (p_preset) {
case PRESET_TOP_LEFT:
@@ -1363,6 +1394,7 @@ void Control::_set_position(const Point2 &p_point) {
}
void Control::set_position(const Point2 &p_point, bool p_keep_offsets) {
+ ERR_MAIN_THREAD_GUARD;
if (p_keep_offsets) {
_compute_anchors(Rect2(p_point, data.size_cache), data.offset, data.anchor);
} else {
@@ -1372,6 +1404,7 @@ void Control::set_position(const Point2 &p_point, bool p_keep_offsets) {
}
Size2 Control::get_position() const {
+ ERR_READ_THREAD_GUARD_V(Size2());
return data.pos_cache;
}
@@ -1380,6 +1413,7 @@ void Control::_set_global_position(const Point2 &p_point) {
}
void Control::set_global_position(const Point2 &p_point, bool p_keep_offsets) {
+ ERR_MAIN_THREAD_GUARD;
Transform2D inv;
if (data.parent_canvas_item) {
@@ -1390,10 +1424,12 @@ void Control::set_global_position(const Point2 &p_point, bool p_keep_offsets) {
}
Point2 Control::get_global_position() const {
+ ERR_READ_THREAD_GUARD_V(Point2());
return get_global_transform().get_origin();
}
Point2 Control::get_screen_position() const {
+ ERR_READ_THREAD_GUARD_V(Point2());
ERR_FAIL_COND_V(!is_inside_tree(), Point2());
return get_screen_transform().get_origin();
}
@@ -1408,6 +1444,7 @@ void Control::_set_size(const Size2 &p_size) {
}
void Control::set_size(const Size2 &p_size, bool p_keep_offsets) {
+ ERR_MAIN_THREAD_GUARD;
ERR_FAIL_COND(!isfinite(p_size.x) || !isfinite(p_size.y));
Size2 new_size = p_size;
Size2 min = get_combined_minimum_size();
@@ -1427,14 +1464,17 @@ void Control::set_size(const Size2 &p_size, bool p_keep_offsets) {
}
Size2 Control::get_size() const {
+ ERR_READ_THREAD_GUARD_V(Size2());
return data.size_cache;
}
void Control::reset_size() {
+ ERR_MAIN_THREAD_GUARD;
set_size(Size2());
}
void Control::set_rect(const Rect2 &p_rect) {
+ ERR_MAIN_THREAD_GUARD;
for (int i = 0; i < 4; i++) {
data.anchor[i] = ANCHOR_BEGIN;
}
@@ -1446,16 +1486,19 @@ void Control::set_rect(const Rect2 &p_rect) {
}
Rect2 Control::get_rect() const {
+ ERR_READ_THREAD_GUARD_V(Rect2());
Transform2D xform = get_transform();
return Rect2(xform.get_origin(), xform.get_scale() * get_size());
}
Rect2 Control::get_global_rect() const {
+ ERR_READ_THREAD_GUARD_V(Rect2());
Transform2D xform = get_global_transform();
return Rect2(xform.get_origin(), xform.get_scale() * get_size());
}
Rect2 Control::get_screen_rect() const {
+ ERR_READ_THREAD_GUARD_V(Rect2());
ERR_FAIL_COND_V(!is_inside_tree(), Rect2());
Transform2D xform = get_screen_transform();
@@ -1463,10 +1506,12 @@ Rect2 Control::get_screen_rect() const {
}
Rect2 Control::get_anchorable_rect() const {
+ ERR_READ_THREAD_GUARD_V(Rect2());
return Rect2(Point2(), get_size());
}
void Control::set_scale(const Vector2 &p_scale) {
+ ERR_MAIN_THREAD_GUARD;
if (data.scale == p_scale) {
return;
}
@@ -1484,10 +1529,12 @@ void Control::set_scale(const Vector2 &p_scale) {
}
Vector2 Control::get_scale() const {
+ ERR_READ_THREAD_GUARD_V(Vector2());
return data.scale;
}
void Control::set_rotation(real_t p_radians) {
+ ERR_MAIN_THREAD_GUARD;
if (data.rotation == p_radians) {
return;
}
@@ -1498,18 +1545,22 @@ void Control::set_rotation(real_t p_radians) {
}
void Control::set_rotation_degrees(real_t p_degrees) {
+ ERR_MAIN_THREAD_GUARD;
set_rotation(Math::deg_to_rad(p_degrees));
}
real_t Control::get_rotation() const {
+ ERR_READ_THREAD_GUARD_V(0);
return data.rotation;
}
real_t Control::get_rotation_degrees() const {
+ ERR_READ_THREAD_GUARD_V(0);
return Math::rad_to_deg(get_rotation());
}
void Control::set_pivot_offset(const Vector2 &p_pivot) {
+ ERR_MAIN_THREAD_GUARD;
if (data.pivot_offset == p_pivot) {
return;
}
@@ -1520,6 +1571,7 @@ void Control::set_pivot_offset(const Vector2 &p_pivot) {
}
Vector2 Control::get_pivot_offset() const {
+ ERR_READ_THREAD_GUARD_V(Vector2());
return data.pivot_offset;
}
@@ -1541,6 +1593,7 @@ void Control::_update_minimum_size() {
}
void Control::update_minimum_size() {
+ ERR_MAIN_THREAD_GUARD;
if (!is_inside_tree() || data.block_minimum_size_adjust) {
return;
}
@@ -1577,16 +1630,19 @@ void Control::update_minimum_size() {
}
void Control::set_block_minimum_size_adjust(bool p_block) {
+ ERR_MAIN_THREAD_GUARD;
data.block_minimum_size_adjust = p_block;
}
Size2 Control::get_minimum_size() const {
+ ERR_READ_THREAD_GUARD_V(Size2());
Vector2 ms;
GDVIRTUAL_CALL(_get_minimum_size, ms);
return ms;
}
void Control::set_custom_minimum_size(const Size2 &p_custom) {
+ ERR_MAIN_THREAD_GUARD;
if (p_custom == data.custom_minimum_size) {
return;
}
@@ -1601,6 +1657,7 @@ void Control::set_custom_minimum_size(const Size2 &p_custom) {
}
Size2 Control::get_custom_minimum_size() const {
+ ERR_READ_THREAD_GUARD_V(Size2());
return data.custom_minimum_size;
}
@@ -1623,6 +1680,7 @@ void Control::_update_minimum_size_cache() {
}
Size2 Control::get_combined_minimum_size() const {
+ ERR_READ_THREAD_GUARD_V(Size2());
if (!data.minimum_size_valid) {
const_cast<Control *>(this)->_update_minimum_size_cache();
}
@@ -1696,6 +1754,7 @@ void Control::_clear_size_warning() {
// Container sizing.
void Control::set_h_size_flags(BitField<SizeFlags> p_flags) {
+ ERR_MAIN_THREAD_GUARD;
if ((int)data.h_size_flags == (int)p_flags) {
return;
}
@@ -1704,10 +1763,12 @@ void Control::set_h_size_flags(BitField<SizeFlags> p_flags) {
}
BitField<Control::SizeFlags> Control::get_h_size_flags() const {
+ ERR_READ_THREAD_GUARD_V(SIZE_EXPAND_FILL);
return data.h_size_flags;
}
void Control::set_v_size_flags(BitField<SizeFlags> p_flags) {
+ ERR_MAIN_THREAD_GUARD;
if ((int)data.v_size_flags == (int)p_flags) {
return;
}
@@ -1716,10 +1777,12 @@ void Control::set_v_size_flags(BitField<SizeFlags> p_flags) {
}
BitField<Control::SizeFlags> Control::get_v_size_flags() const {
+ ERR_READ_THREAD_GUARD_V(SIZE_EXPAND_FILL);
return data.v_size_flags;
}
void Control::set_stretch_ratio(real_t p_ratio) {
+ ERR_MAIN_THREAD_GUARD;
if (data.expand == p_ratio) {
return;
}
@@ -1729,6 +1792,7 @@ void Control::set_stretch_ratio(real_t p_ratio) {
}
real_t Control::get_stretch_ratio() const {
+ ERR_READ_THREAD_GUARD_V(0);
return data.expand;
}
@@ -1755,12 +1819,14 @@ void Control::gui_input(const Ref<InputEvent> &p_event) {
}
void Control::accept_event() {
+ ERR_MAIN_THREAD_GUARD;
if (is_inside_tree()) {
get_viewport()->_gui_accept_event();
}
}
bool Control::has_point(const Point2 &p_point) const {
+ ERR_READ_THREAD_GUARD_V(false);
bool ret;
if (GDVIRTUAL_CALL(_has_point, p_point, ret)) {
return ret;
@@ -1769,6 +1835,7 @@ bool Control::has_point(const Point2 &p_point) const {
}
void Control::set_mouse_filter(MouseFilter p_filter) {
+ ERR_MAIN_THREAD_GUARD;
ERR_FAIL_INDEX(p_filter, 3);
data.mouse_filter = p_filter;
notify_property_list_changed();
@@ -1776,23 +1843,28 @@ void Control::set_mouse_filter(MouseFilter p_filter) {
}
Control::MouseFilter Control::get_mouse_filter() const {
+ ERR_READ_THREAD_GUARD_V(MOUSE_FILTER_IGNORE);
return data.mouse_filter;
}
void Control::set_force_pass_scroll_events(bool p_force_pass_scroll_events) {
+ ERR_MAIN_THREAD_GUARD;
data.force_pass_scroll_events = p_force_pass_scroll_events;
}
bool Control::is_force_pass_scroll_events() const {
+ ERR_READ_THREAD_GUARD_V(false);
return data.force_pass_scroll_events;
}
void Control::warp_mouse(const Point2 &p_position) {
+ ERR_MAIN_THREAD_GUARD;
ERR_FAIL_COND(!is_inside_tree());
get_viewport()->warp_mouse(get_global_transform_with_canvas().xform(p_position));
}
void Control::set_shortcut_context(const Node *p_node) {
+ ERR_MAIN_THREAD_GUARD;
if (p_node != nullptr) {
data.shortcut_context = p_node->get_instance_id();
} else {
@@ -1801,6 +1873,7 @@ void Control::set_shortcut_context(const Node *p_node) {
}
Node *Control::get_shortcut_context() const {
+ ERR_READ_THREAD_GUARD_V(nullptr);
Object *ctx_obj = ObjectDB::get_instance(data.shortcut_context);
Node *ctx_node = Object::cast_to<Node>(ctx_obj);
@@ -1808,6 +1881,7 @@ Node *Control::get_shortcut_context() const {
}
bool Control::is_focus_owner_in_shortcut_context() const {
+ ERR_READ_THREAD_GUARD_V(false);
if (data.shortcut_context == ObjectID()) {
// No context, therefore global - always "in" context.
return true;
@@ -1823,12 +1897,14 @@ bool Control::is_focus_owner_in_shortcut_context() const {
// Drag and drop handling.
void Control::set_drag_forwarding(const Callable &p_drag, const Callable &p_can_drop, const Callable &p_drop) {
+ ERR_MAIN_THREAD_GUARD;
data.forward_drag = p_drag;
data.forward_can_drop = p_can_drop;
data.forward_drop = p_drop;
}
Variant Control::get_drag_data(const Point2 &p_point) {
+ ERR_READ_THREAD_GUARD_V(Variant());
Variant ret;
if (data.forward_drag.is_valid()) {
Variant p = p_point;
@@ -1846,6 +1922,7 @@ Variant Control::get_drag_data(const Point2 &p_point) {
}
bool Control::can_drop_data(const Point2 &p_point, const Variant &p_data) const {
+ ERR_READ_THREAD_GUARD_V(false);
if (data.forward_can_drop.is_valid()) {
Variant ret;
Variant p = p_point;
@@ -1864,6 +1941,7 @@ bool Control::can_drop_data(const Point2 &p_point, const Variant &p_data) const
}
void Control::drop_data(const Point2 &p_point, const Variant &p_data) {
+ ERR_READ_THREAD_GUARD;
if (data.forward_drop.is_valid()) {
Variant ret;
Variant p = p_point;
@@ -1880,6 +1958,7 @@ void Control::drop_data(const Point2 &p_point, const Variant &p_data) {
}
void Control::force_drag(const Variant &p_data, Control *p_control) {
+ ERR_MAIN_THREAD_GUARD;
ERR_FAIL_COND(!is_inside_tree());
ERR_FAIL_COND(p_data.get_type() == Variant::NIL);
@@ -1887,18 +1966,21 @@ void Control::force_drag(const Variant &p_data, Control *p_control) {
}
void Control::set_drag_preview(Control *p_control) {
+ ERR_MAIN_THREAD_GUARD;
ERR_FAIL_COND(!is_inside_tree());
ERR_FAIL_COND(!get_viewport()->gui_is_dragging());
get_viewport()->_gui_set_drag_preview(this, p_control);
}
bool Control::is_drag_successful() const {
+ ERR_READ_THREAD_GUARD_V(false);
return is_inside_tree() && get_viewport()->gui_is_drag_successful();
}
// Focus.
void Control::set_focus_mode(FocusMode p_focus_mode) {
+ ERR_MAIN_THREAD_GUARD;
ERR_FAIL_INDEX((int)p_focus_mode, 3);
if (is_inside_tree() && p_focus_mode == FOCUS_NONE && data.focus_mode != FOCUS_NONE && has_focus()) {
@@ -1909,14 +1991,17 @@ void Control::set_focus_mode(FocusMode p_focus_mode) {
}
Control::FocusMode Control::get_focus_mode() const {
+ ERR_READ_THREAD_GUARD_V(FOCUS_NONE);
return data.focus_mode;
}
bool Control::has_focus() const {
+ ERR_READ_THREAD_GUARD_V(false);
return is_inside_tree() && get_viewport()->_gui_control_has_focus(this);
}
void Control::grab_focus() {
+ ERR_MAIN_THREAD_GUARD;
ERR_FAIL_COND(!is_inside_tree());
if (data.focus_mode == FOCUS_NONE) {
@@ -1928,12 +2013,14 @@ void Control::grab_focus() {
}
void Control::grab_click_focus() {
+ ERR_MAIN_THREAD_GUARD;
ERR_FAIL_COND(!is_inside_tree());
get_viewport()->_gui_grab_click_focus(this);
}
void Control::release_focus() {
+ ERR_MAIN_THREAD_GUARD;
ERR_FAIL_COND(!is_inside_tree());
if (!has_focus()) {
@@ -1970,6 +2057,7 @@ static Control *_next_control(Control *p_from) {
}
Control *Control::find_next_valid_focus() const {
+ ERR_READ_THREAD_GUARD_V(nullptr);
Control *from = const_cast<Control *>(this);
while (true) {
@@ -2060,6 +2148,7 @@ static Control *_prev_control(Control *p_from) {
}
Control *Control::find_prev_valid_focus() const {
+ ERR_READ_THREAD_GUARD_V(nullptr);
Control *from = const_cast<Control *>(this);
while (true) {
@@ -2122,28 +2211,34 @@ Control *Control::find_prev_valid_focus() const {
}
void Control::set_focus_neighbor(Side p_side, const NodePath &p_neighbor) {
+ ERR_MAIN_THREAD_GUARD;
ERR_FAIL_INDEX((int)p_side, 4);
data.focus_neighbor[p_side] = p_neighbor;
}
NodePath Control::get_focus_neighbor(Side p_side) const {
+ ERR_READ_THREAD_GUARD_V(NodePath());
ERR_FAIL_INDEX_V((int)p_side, 4, NodePath());
return data.focus_neighbor[p_side];
}
void Control::set_focus_next(const NodePath &p_next) {
+ ERR_MAIN_THREAD_GUARD;
data.focus_next = p_next;
}
NodePath Control::get_focus_next() const {
+ ERR_READ_THREAD_GUARD_V(NodePath());
return data.focus_next;
}
void Control::set_focus_previous(const NodePath &p_prev) {
+ ERR_MAIN_THREAD_GUARD;
data.focus_prev = p_prev;
}
NodePath Control::get_focus_previous() const {
+ ERR_READ_THREAD_GUARD_V(NodePath());
return data.focus_prev;
}
@@ -2290,6 +2385,7 @@ void Control::_window_find_focus_neighbor(const Vector2 &p_dir, Node *p_at, cons
// Rendering.
void Control::set_default_cursor_shape(CursorShape p_shape) {
+ ERR_MAIN_THREAD_GUARD;
ERR_FAIL_INDEX(int(p_shape), CURSOR_MAX);
if (data.default_cursor == p_shape) {
@@ -2308,14 +2404,17 @@ void Control::set_default_cursor_shape(CursorShape p_shape) {
}
Control::CursorShape Control::get_default_cursor_shape() const {
+ ERR_READ_THREAD_GUARD_V(CURSOR_ARROW);
return data.default_cursor;
}
Control::CursorShape Control::get_cursor_shape(const Point2 &p_pos) const {
+ ERR_READ_THREAD_GUARD_V(CURSOR_ARROW);
return data.default_cursor;
}
void Control::set_disable_visibility_clip(bool p_ignore) {
+ ERR_MAIN_THREAD_GUARD;
if (data.disable_visibility_clip == p_ignore) {
return;
}
@@ -2324,10 +2423,12 @@ void Control::set_disable_visibility_clip(bool p_ignore) {
}
bool Control::is_visibility_clip_disabled() const {
+ ERR_READ_THREAD_GUARD_V(false);
return data.disable_visibility_clip;
}
void Control::set_clip_contents(bool p_clip) {
+ ERR_MAIN_THREAD_GUARD;
if (data.clip_contents == p_clip) {
return;
}
@@ -2336,6 +2437,7 @@ void Control::set_clip_contents(bool p_clip) {
}
bool Control::is_clipping_contents() {
+ ERR_READ_THREAD_GUARD_V(false);
return data.clip_contents;
}
@@ -2366,18 +2468,22 @@ void Control::_update_theme_item_cache() {
}
void Control::set_theme_owner_node(Node *p_node) {
+ ERR_MAIN_THREAD_GUARD;
data.theme_owner->set_owner_node(p_node);
}
Node *Control::get_theme_owner_node() const {
+ ERR_READ_THREAD_GUARD_V(nullptr);
return data.theme_owner->get_owner_node();
}
bool Control::has_theme_owner_node() const {
+ ERR_READ_THREAD_GUARD_V(false);
return data.theme_owner->has_owner_node();
}
void Control::set_theme(const Ref<Theme> &p_theme) {
+ ERR_MAIN_THREAD_GUARD;
if (data.theme == p_theme) {
return;
}
@@ -2409,10 +2515,12 @@ void Control::set_theme(const Ref<Theme> &p_theme) {
}
Ref<Theme> Control::get_theme() const {
+ ERR_READ_THREAD_GUARD_V(Ref<Theme>());
return data.theme;
}
void Control::set_theme_type_variation(const StringName &p_theme_type) {
+ ERR_MAIN_THREAD_GUARD;
if (data.theme_type_variation == p_theme_type) {
return;
}
@@ -2423,12 +2531,14 @@ void Control::set_theme_type_variation(const StringName &p_theme_type) {
}
StringName Control::get_theme_type_variation() const {
+ ERR_READ_THREAD_GUARD_V(StringName());
return data.theme_type_variation;
}
/// Theme property lookup.
Ref<Texture2D> Control::get_theme_icon(const StringName &p_name, const StringName &p_theme_type) const {
+ ERR_READ_THREAD_GUARD_V(Ref<Texture2D>());
if (!data.initialized) {
WARN_PRINT_ONCE("Attempting to access theme items too early; prefer NOTIFICATION_POSTINITIALIZE and NOTIFICATION_THEME_CHANGED");
}
@@ -2452,6 +2562,7 @@ Ref<Texture2D> Control::get_theme_icon(const StringName &p_name, const StringNam
}
Ref<StyleBox> Control::get_theme_stylebox(const StringName &p_name, const StringName &p_theme_type) const {
+ ERR_READ_THREAD_GUARD_V(Ref<StyleBox>());
if (!data.initialized) {
WARN_PRINT_ONCE("Attempting to access theme items too early; prefer NOTIFICATION_POSTINITIALIZE and NOTIFICATION_THEME_CHANGED");
}
@@ -2475,6 +2586,7 @@ Ref<StyleBox> Control::get_theme_stylebox(const StringName &p_name, const String
}
Ref<Font> Control::get_theme_font(const StringName &p_name, const StringName &p_theme_type) const {
+ ERR_READ_THREAD_GUARD_V(Ref<Font>());
if (!data.initialized) {
WARN_PRINT_ONCE("Attempting to access theme items too early; prefer NOTIFICATION_POSTINITIALIZE and NOTIFICATION_THEME_CHANGED");
}
@@ -2498,6 +2610,7 @@ Ref<Font> Control::get_theme_font(const StringName &p_name, const StringName &p_
}
int Control::get_theme_font_size(const StringName &p_name, const StringName &p_theme_type) const {
+ ERR_READ_THREAD_GUARD_V(0);
if (!data.initialized) {
WARN_PRINT_ONCE("Attempting to access theme items too early; prefer NOTIFICATION_POSTINITIALIZE and NOTIFICATION_THEME_CHANGED");
}
@@ -2521,6 +2634,7 @@ int Control::get_theme_font_size(const StringName &p_name, const StringName &p_t
}
Color Control::get_theme_color(const StringName &p_name, const StringName &p_theme_type) const {
+ ERR_READ_THREAD_GUARD_V(Color());
if (!data.initialized) {
WARN_PRINT_ONCE("Attempting to access theme items too early; prefer NOTIFICATION_POSTINITIALIZE and NOTIFICATION_THEME_CHANGED");
}
@@ -2544,6 +2658,7 @@ Color Control::get_theme_color(const StringName &p_name, const StringName &p_the
}
int Control::get_theme_constant(const StringName &p_name, const StringName &p_theme_type) const {
+ ERR_READ_THREAD_GUARD_V(0);
if (!data.initialized) {
WARN_PRINT_ONCE("Attempting to access theme items too early; prefer NOTIFICATION_POSTINITIALIZE and NOTIFICATION_THEME_CHANGED");
}
@@ -2567,6 +2682,7 @@ int Control::get_theme_constant(const StringName &p_name, const StringName &p_th
}
bool Control::has_theme_icon(const StringName &p_name, const StringName &p_theme_type) const {
+ ERR_READ_THREAD_GUARD_V(false);
if (!data.initialized) {
WARN_PRINT_ONCE("Attempting to access theme items too early; prefer NOTIFICATION_POSTINITIALIZE and NOTIFICATION_THEME_CHANGED");
}
@@ -2583,6 +2699,7 @@ bool Control::has_theme_icon(const StringName &p_name, const StringName &p_theme
}
bool Control::has_theme_stylebox(const StringName &p_name, const StringName &p_theme_type) const {
+ ERR_READ_THREAD_GUARD_V(false);
if (!data.initialized) {
WARN_PRINT_ONCE("Attempting to access theme items too early; prefer NOTIFICATION_POSTINITIALIZE and NOTIFICATION_THEME_CHANGED");
}
@@ -2599,6 +2716,7 @@ bool Control::has_theme_stylebox(const StringName &p_name, const StringName &p_t
}
bool Control::has_theme_font(const StringName &p_name, const StringName &p_theme_type) const {
+ ERR_READ_THREAD_GUARD_V(false);
if (!data.initialized) {
WARN_PRINT_ONCE("Attempting to access theme items too early; prefer NOTIFICATION_POSTINITIALIZE and NOTIFICATION_THEME_CHANGED");
}
@@ -2615,6 +2733,7 @@ bool Control::has_theme_font(const StringName &p_name, const StringName &p_theme
}
bool Control::has_theme_font_size(const StringName &p_name, const StringName &p_theme_type) const {
+ ERR_READ_THREAD_GUARD_V(false);
if (!data.initialized) {
WARN_PRINT_ONCE("Attempting to access theme items too early; prefer NOTIFICATION_POSTINITIALIZE and NOTIFICATION_THEME_CHANGED");
}
@@ -2631,6 +2750,7 @@ bool Control::has_theme_font_size(const StringName &p_name, const StringName &p_
}
bool Control::has_theme_color(const StringName &p_name, const StringName &p_theme_type) const {
+ ERR_READ_THREAD_GUARD_V(false);
if (!data.initialized) {
WARN_PRINT_ONCE("Attempting to access theme items too early; prefer NOTIFICATION_POSTINITIALIZE and NOTIFICATION_THEME_CHANGED");
}
@@ -2647,6 +2767,7 @@ bool Control::has_theme_color(const StringName &p_name, const StringName &p_them
}
bool Control::has_theme_constant(const StringName &p_name, const StringName &p_theme_type) const {
+ ERR_READ_THREAD_GUARD_V(false);
if (!data.initialized) {
WARN_PRINT_ONCE("Attempting to access theme items too early; prefer NOTIFICATION_POSTINITIALIZE and NOTIFICATION_THEME_CHANGED");
}
@@ -2665,6 +2786,7 @@ bool Control::has_theme_constant(const StringName &p_name, const StringName &p_t
/// Local property overrides.
void Control::add_theme_icon_override(const StringName &p_name, const Ref<Texture2D> &p_icon) {
+ ERR_MAIN_THREAD_GUARD;
ERR_FAIL_COND(!p_icon.is_valid());
if (data.theme_icon_override.has(p_name)) {
@@ -2677,6 +2799,7 @@ void Control::add_theme_icon_override(const StringName &p_name, const Ref<Textur
}
void Control::add_theme_style_override(const StringName &p_name, const Ref<StyleBox> &p_style) {
+ ERR_MAIN_THREAD_GUARD;
ERR_FAIL_COND(!p_style.is_valid());
if (data.theme_style_override.has(p_name)) {
@@ -2689,6 +2812,7 @@ void Control::add_theme_style_override(const StringName &p_name, const Ref<Style
}
void Control::add_theme_font_override(const StringName &p_name, const Ref<Font> &p_font) {
+ ERR_MAIN_THREAD_GUARD;
ERR_FAIL_COND(!p_font.is_valid());
if (data.theme_font_override.has(p_name)) {
@@ -2701,21 +2825,25 @@ void Control::add_theme_font_override(const StringName &p_name, const Ref<Font>
}
void Control::add_theme_font_size_override(const StringName &p_name, int p_font_size) {
+ ERR_MAIN_THREAD_GUARD;
data.theme_font_size_override[p_name] = p_font_size;
_notify_theme_override_changed();
}
void Control::add_theme_color_override(const StringName &p_name, const Color &p_color) {
+ ERR_MAIN_THREAD_GUARD;
data.theme_color_override[p_name] = p_color;
_notify_theme_override_changed();
}
void Control::add_theme_constant_override(const StringName &p_name, int p_constant) {
+ ERR_MAIN_THREAD_GUARD;
data.theme_constant_override[p_name] = p_constant;
_notify_theme_override_changed();
}
void Control::remove_theme_icon_override(const StringName &p_name) {
+ ERR_MAIN_THREAD_GUARD;
if (data.theme_icon_override.has(p_name)) {
data.theme_icon_override[p_name]->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed));
}
@@ -2725,6 +2853,7 @@ void Control::remove_theme_icon_override(const StringName &p_name) {
}
void Control::remove_theme_style_override(const StringName &p_name) {
+ ERR_MAIN_THREAD_GUARD;
if (data.theme_style_override.has(p_name)) {
data.theme_style_override[p_name]->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed));
}
@@ -2734,6 +2863,7 @@ void Control::remove_theme_style_override(const StringName &p_name) {
}
void Control::remove_theme_font_override(const StringName &p_name) {
+ ERR_MAIN_THREAD_GUARD;
if (data.theme_font_override.has(p_name)) {
data.theme_font_override[p_name]->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed));
}
@@ -2743,46 +2873,55 @@ void Control::remove_theme_font_override(const StringName &p_name) {
}
void Control::remove_theme_font_size_override(const StringName &p_name) {
+ ERR_MAIN_THREAD_GUARD;
data.theme_font_size_override.erase(p_name);
_notify_theme_override_changed();
}
void Control::remove_theme_color_override(const StringName &p_name) {
+ ERR_MAIN_THREAD_GUARD;
data.theme_color_override.erase(p_name);
_notify_theme_override_changed();
}
void Control::remove_theme_constant_override(const StringName &p_name) {
+ ERR_MAIN_THREAD_GUARD;
data.theme_constant_override.erase(p_name);
_notify_theme_override_changed();
}
bool Control::has_theme_icon_override(const StringName &p_name) const {
+ ERR_READ_THREAD_GUARD_V(false);
const Ref<Texture2D> *tex = data.theme_icon_override.getptr(p_name);
return tex != nullptr;
}
bool Control::has_theme_stylebox_override(const StringName &p_name) const {
+ ERR_READ_THREAD_GUARD_V(false);
const Ref<StyleBox> *style = data.theme_style_override.getptr(p_name);
return style != nullptr;
}
bool Control::has_theme_font_override(const StringName &p_name) const {
+ ERR_READ_THREAD_GUARD_V(false);
const Ref<Font> *font = data.theme_font_override.getptr(p_name);
return font != nullptr;
}
bool Control::has_theme_font_size_override(const StringName &p_name) const {
+ ERR_READ_THREAD_GUARD_V(false);
const int *font_size = data.theme_font_size_override.getptr(p_name);
return font_size != nullptr;
}
bool Control::has_theme_color_override(const StringName &p_name) const {
+ ERR_READ_THREAD_GUARD_V(false);
const Color *color = data.theme_color_override.getptr(p_name);
return color != nullptr;
}
bool Control::has_theme_constant_override(const StringName &p_name) const {
+ ERR_READ_THREAD_GUARD_V(false);
const int *constant = data.theme_constant_override.getptr(p_name);
return constant != nullptr;
}
@@ -2790,24 +2929,29 @@ bool Control::has_theme_constant_override(const StringName &p_name) const {
/// Default theme properties.
float Control::get_theme_default_base_scale() const {
+ ERR_READ_THREAD_GUARD_V(0);
return data.theme_owner->get_theme_default_base_scale();
}
Ref<Font> Control::get_theme_default_font() const {
+ ERR_READ_THREAD_GUARD_V(Ref<Font>());
return data.theme_owner->get_theme_default_font();
}
int Control::get_theme_default_font_size() const {
+ ERR_READ_THREAD_GUARD_V(0);
return data.theme_owner->get_theme_default_font_size();
}
/// Bulk actions.
void Control::begin_bulk_theme_override() {
+ ERR_MAIN_THREAD_GUARD;
data.bulk_theme_override = true;
}
void Control::end_bulk_theme_override() {
+ ERR_MAIN_THREAD_GUARD;
ERR_FAIL_COND(!data.bulk_theme_override);
data.bulk_theme_override = false;
@@ -2817,6 +2961,7 @@ void Control::end_bulk_theme_override() {
// Internationalization.
TypedArray<Vector3i> Control::structured_text_parser(TextServer::StructuredTextParser p_parser_type, const Array &p_args, const String &p_text) const {
+ ERR_READ_THREAD_GUARD_V(TypedArray<Vector3i>());
if (p_parser_type == TextServer::STRUCTURED_TEXT_CUSTOM) {
TypedArray<Vector3i> ret;
GDVIRTUAL_CALL(_structured_text_parser, p_args, p_text, ret);
@@ -2827,6 +2972,7 @@ TypedArray<Vector3i> Control::structured_text_parser(TextServer::StructuredTextP
}
void Control::set_layout_direction(Control::LayoutDirection p_direction) {
+ ERR_MAIN_THREAD_GUARD;
if (data.layout_dir == p_direction) {
return;
}
@@ -2839,10 +2985,12 @@ void Control::set_layout_direction(Control::LayoutDirection p_direction) {
}
Control::LayoutDirection Control::get_layout_direction() const {
+ ERR_READ_THREAD_GUARD_V(LAYOUT_DIRECTION_INHERITED);
return data.layout_dir;
}
bool Control::is_layout_rtl() const {
+ ERR_READ_THREAD_GUARD_V(false);
if (data.is_rtl_dirty) {
const_cast<Control *>(this)->data.is_rtl_dirty = false;
if (data.layout_dir == LAYOUT_DIRECTION_INHERITED) {
@@ -2890,6 +3038,7 @@ bool Control::is_layout_rtl() const {
}
void Control::set_localize_numeral_system(bool p_enable) {
+ ERR_MAIN_THREAD_GUARD;
if (p_enable == data.localize_numeral_system) {
return;
}
@@ -2900,10 +3049,12 @@ void Control::set_localize_numeral_system(bool p_enable) {
}
bool Control::is_localizing_numeral_system() const {
+ ERR_READ_THREAD_GUARD_V(false);
return data.localize_numeral_system;
}
void Control::set_auto_translate(bool p_enable) {
+ ERR_MAIN_THREAD_GUARD;
if (p_enable == data.auto_translate) {
return;
}
@@ -2914,21 +3065,25 @@ void Control::set_auto_translate(bool p_enable) {
}
bool Control::is_auto_translating() const {
+ ERR_READ_THREAD_GUARD_V(false);
return data.auto_translate;
}
// Extra properties.
void Control::set_tooltip_text(const String &p_hint) {
+ ERR_MAIN_THREAD_GUARD;
data.tooltip = p_hint;
update_configuration_warnings();
}
String Control::get_tooltip_text() const {
+ ERR_READ_THREAD_GUARD_V(String());
return data.tooltip;
}
String Control::get_tooltip(const Point2 &p_pos) const {
+ ERR_READ_THREAD_GUARD_V(String());
String ret;
if (GDVIRTUAL_CALL(_get_tooltip, p_pos, ret)) {
return ret;
@@ -2937,6 +3092,7 @@ String Control::get_tooltip(const Point2 &p_pos) const {
}
Control *Control::make_custom_tooltip(const String &p_text) const {
+ ERR_READ_THREAD_GUARD_V(nullptr);
Object *ret = nullptr;
GDVIRTUAL_CALL(_make_custom_tooltip, p_text, ret);
return Object::cast_to<Control>(ret);
@@ -2945,6 +3101,7 @@ Control *Control::make_custom_tooltip(const String &p_text) const {
// Base object overrides.
void Control::_notification(int p_notification) {
+ ERR_MAIN_THREAD_GUARD;
switch (p_notification) {
case NOTIFICATION_POSTINITIALIZE: {
data.initialized = true;