summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Wigg <john.wigg@gmx.net>2020-04-13 14:30:56 +0200
committerCaptainProton42 <john.wigg@gmx.net>2020-04-29 11:31:01 +0200
commit4a82390aafdf464a2776b1df3a75b47783d42b04 (patch)
tree1f735029638bfbe2b459b4a8db2dd31e3f264246
parentd4b211bb3d8c71dc48b933fe1cede6250069b857 (diff)
Limit undo stack size
The stack size of the undo history of a TextEdit was not limited leading to potential memory leaks when doing lots of operations on a TextEdit. This commit adds the option gui/common/text_edit_undo_stack_max_size to the project settings. The first element of the undo stack is popped if the stack's size exceeds this value ensuring limited memory usage. The default stack size setting is 1024. Fixes #37838.
-rw-r--r--scene/gui/text_edit.cpp7
-rw-r--r--scene/gui/text_edit.h1
2 files changed, 8 insertions, 0 deletions
diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp
index 36e35897d1..d854806121 100644
--- a/scene/gui/text_edit.cpp
+++ b/scene/gui/text_edit.cpp
@@ -6220,6 +6220,10 @@ void TextEdit::_push_current_op() {
current_op.type = TextOperation::TYPE_NONE;
current_op.text = "";
current_op.chain_forward = false;
+
+ if (undo_stack.size() > undo_stack_max_size) {
+ undo_stack.pop_front();
+ }
}
void TextEdit::set_indent_using_spaces(const bool p_use_spaces) {
@@ -7244,6 +7248,8 @@ void TextEdit::_bind_methods() {
GLOBAL_DEF("gui/timers/text_edit_idle_detect_sec", 3);
ProjectSettings::get_singleton()->set_custom_property_info("gui/timers/text_edit_idle_detect_sec", PropertyInfo(Variant::FLOAT, "gui/timers/text_edit_idle_detect_sec", PROPERTY_HINT_RANGE, "0,10,0.01,or_greater")); // No negative numbers.
+ GLOBAL_DEF("gui/common/text_edit_undo_stack_max_size", 1024);
+ ProjectSettings::get_singleton()->set_custom_property_info("gui/common/text_edit_undo_stack_max_size", PropertyInfo(Variant::INT, "gui/common/text_edit_undo_stack_max_size", PROPERTY_HINT_RANGE, "0,10000,1,or_greater")); // No negative numbers.
}
TextEdit::TextEdit() {
@@ -7323,6 +7329,7 @@ TextEdit::TextEdit() {
current_op.type = TextOperation::TYPE_NONE;
undo_enabled = true;
+ undo_stack_max_size = GLOBAL_GET("gui/common/text_edit_undo_stack_max_size");
undo_stack_pos = nullptr;
setting_text = false;
last_dblclk = 0;
diff --git a/scene/gui/text_edit.h b/scene/gui/text_edit.h
index ef8c39d32f..ac8eb5da1d 100644
--- a/scene/gui/text_edit.h
+++ b/scene/gui/text_edit.h
@@ -306,6 +306,7 @@ private:
List<TextOperation> undo_stack;
List<TextOperation>::Element *undo_stack_pos;
+ int undo_stack_max_size;
void _clear_redo();
void _do_text_op(const TextOperation &p_op, bool p_reverse);