From ff5817b8a6bac569394acc4d82a3124942341fd6 Mon Sep 17 00:00:00 2001
From: Arthur Sonzogni <sonzogniarthur@gmail.com>
Date: Sun, 4 Jun 2023 21:34:16 +0200
Subject: [PATCH] Fix on_enter bug in ftxui::Input (#667)

Fixed:https://github.com/ArthurSonzogni/FTXUI/issues/666
---
 src/ftxui/component/input.cpp      | 22 +++++++---------------
 src/ftxui/component/input_test.cpp | 12 ++++++++++++
 2 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/src/ftxui/component/input.cpp b/src/ftxui/component/input.cpp
index c19b508d..1f49d919 100644
--- a/src/ftxui/component/input.cpp
+++ b/src/ftxui/component/input.cpp
@@ -341,27 +341,19 @@ class InputBase : public ComponentBase {
   }
 
   bool HandleReturn() {
-    int& cursor_position = option_->cursor_position();
-    content_->insert(cursor_position, "\n");
-    cursor_position++;
-    option_->on_change();
+    if (option_->multiline()) {
+      HandleCharacter("\n");
+    }
+    option_->on_enter();
     return true;
   }
 
   bool HandleCharacter(const std::string& character) {
-    if (character == "\n" && !option_->multiline()) {
-      option_->on_enter();
-      return false;
-    }
-
     int& cursor_position = option_->cursor_position();
     content_->insert(cursor_position, character);
     cursor_position += character.size();
     option_->on_change();
 
-    if (character == "\n") {
-      option_->on_enter();
-    }
     return true;
   }
 
@@ -369,6 +361,9 @@ class InputBase : public ComponentBase {
     int& cursor_position = option_->cursor_position();
     cursor_position = util::clamp(cursor_position, 0, (int)content_->size());
 
+    if (event == Event::Return) {
+      return HandleReturn();
+    }
     if (event.is_character()) {
       return HandleCharacter(event.character());
     }
@@ -405,9 +400,6 @@ class InputBase : public ComponentBase {
     if (event == Event::ArrowRightCtrl) {
       return HandleRightCtrl();
     }
-    if (event == Event::Return) {
-      return HandleReturn();
-    }
 
     return false;
   }
diff --git a/src/ftxui/component/input_test.cpp b/src/ftxui/component/input_test.cpp
index 057c3bd4..16440590 100644
--- a/src/ftxui/component/input_test.cpp
+++ b/src/ftxui/component/input_test.cpp
@@ -722,6 +722,18 @@ TEST(InputTest, MouseClickComplex) {
   EXPECT_EQ(option.cursor_position(), 17);
 }
 
+TEST(InputTest, OnEnter) {
+  std::string content;
+  auto option = InputOption();
+  bool on_enter_called = false;
+  option.on_enter = [&] { on_enter_called = true; };
+  Component input = Input(&content, &option);
+
+  EXPECT_FALSE(on_enter_called);
+  EXPECT_TRUE(input->OnEvent(Event::Return));
+  EXPECT_TRUE(on_enter_called);
+}
+
 }  // namespace ftxui
 
 // Copyright 2023 Arthur Sonzogni. All rights reserved.
-- 
GitLab