diff --git a/CHANGELOG.md b/CHANGELOG.md
index cc45103e894bb7eee88da440ba9eedbeaa34003b..6a976af79e5deea30f7c7677a77062389b609e1e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,26 +7,16 @@ current (development)
 ### Component
 - Feature: Add support for `Input`'s insert mode. Add `InputOption::insert`
   option. Added by @mingsheng13.
-- Feature/Bugfix/Breaking change: `Mouse transition`:
+- Bugfix/Breaking change: `Mouse transition`:
+  - Detect when the mouse move, as opposed to being pressed.
+    The Mouse::Moved motion was added.
+  - Dragging the mouse with the left button pressed now avoids activating
+    multiple checkboxes.
+  - A couple of components are now activated when the mouse is pressed,
+  as opposed to being released.
   This fixes: https://github.com/ArthurSonzogni/FTXUI/issues/773
-  Dragging the mouse with the left button pressed now avoids activating multiple
-  checkboxes.
-
-  Add support for detecting mouse press transition. Added:
-  ```cpp
-  // The previous mouse event.
-  Mouse Mouse::previous;
-
-  // Return whether the mouse transitionned from:
-  // released to pressed => IsPressed()
-  // pressed to pressed => IsHeld()
-  // pressed to released => IsReleased()
-  bool Mouse::IsPressed(Button button) const;
-  bool Mouse::IsHeld(Button button) const;
-  bool Mouse::IsReleased(Button button) const;
-  ```
-  A couple of components are now activated when the mouse is pressed,
-  as opposed to released.
+  This fixes: https://github.com/ArthurSonzogni/FTXUI/issues/792
+- Bugfix: mouse.control is now reported correctly.
 - Feature: Add `ScreenInteractive::FullscreenPrimaryScreen()`. This allows
   displaying a fullscreen component on the primary screen, as opposed to the
   alternate screen.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6dc246bf144530aeca432fd9e5f00416966c573f..583ed46a2723070e9ce959e152c6322a3c81d6e4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -123,7 +123,6 @@ add_library(component
   src/ftxui/component/maybe.cpp
   src/ftxui/component/menu.cpp
   src/ftxui/component/modal.cpp
-  src/ftxui/component/mouse.cpp
   src/ftxui/component/radiobox.cpp
   src/ftxui/component/radiobox.cpp
   src/ftxui/component/renderer.cpp
diff --git a/examples/component/print_key_press.cpp b/examples/component/print_key_press.cpp
index c48127197fdf883ed09c4a94b5c671bee786acf0..02b613315c5d0148f14aa162a62ddbfa28a74b42 100644
--- a/examples/component/print_key_press.cpp
+++ b/examples/component/print_key_press.cpp
@@ -55,6 +55,9 @@ std::string Stringify(Event event) {
       case Mouse::Released:
         out += "_released";
         break;
+      case Mouse::Moved:
+        out += "_moved";
+        break;
     }
     if (event.mouse().control)
       out += "_control";
diff --git a/include/ftxui/component/mouse.hpp b/include/ftxui/component/mouse.hpp
index 38bf1e1516a5f1332a8e1280264cb9cb911607ee..adfeb7fa4dbf798c378160b816e5c81f63d29d46 100644
--- a/include/ftxui/component/mouse.hpp
+++ b/include/ftxui/component/mouse.hpp
@@ -21,13 +21,9 @@ struct Mouse {
   enum Motion {
     Released = 0,
     Pressed = 1,
+    Moved = 2,
   };
 
-  // Utility function to check the variations of the mouse state.
-  bool IsPressed(Button btn = Left) const;   // Released => Pressed.
-  bool IsHeld(Button btn = Left) const;      // Pressed => Pressed.
-  bool IsReleased(Button btn = Left) const;  // Pressed => Released.
-
   // Button
   Button button = Button::None;
 
@@ -42,9 +38,6 @@ struct Mouse {
   // Coordinates:
   int x = 0;
   int y = 0;
-
-  // Previous mouse event, if any.
-  Mouse* previous = nullptr;
 };
 
 }  // namespace ftxui
diff --git a/include/ftxui/component/screen_interactive.hpp b/include/ftxui/component/screen_interactive.hpp
index 496e2c1de102728806c12ca2e6d0689191045366..cb4c189c6a116b8ee0076e3deda72e434e9c7f35 100644
--- a/include/ftxui/component/screen_interactive.hpp
+++ b/include/ftxui/component/screen_interactive.hpp
@@ -117,7 +117,6 @@ class ScreenInteractive : public Screen {
   // The style of the cursor to restore on exit.
   int cursor_reset_shape_ = 1;
 
-  Mouse latest_mouse_event_;
   friend class Loop;
 
  public:
diff --git a/src/ftxui/component/button.cpp b/src/ftxui/component/button.cpp
index 229c32ee3b51f1192bac48cde65e9ba85a283487..c983f31f2acbe79fd5c13b096c36b8aea2ef9f37 100644
--- a/src/ftxui/component/button.cpp
+++ b/src/ftxui/component/button.cpp
@@ -124,7 +124,8 @@ class ButtonBase : public ComponentBase, public ButtonOption {
       return false;
     }
 
-    if (event.mouse().IsPressed()) {
+    if (event.mouse().button == Mouse::Left &&
+        event.mouse().motion == Mouse::Pressed) {
       TakeFocus();
       OnClick();
       return true;
diff --git a/src/ftxui/component/checkbox.cpp b/src/ftxui/component/checkbox.cpp
index bf1324f07119d20d89a18e430037f60884cf77ee..ebfa46d8b298a44c0e242998178cc9109683645c 100644
--- a/src/ftxui/component/checkbox.cpp
+++ b/src/ftxui/component/checkbox.cpp
@@ -69,7 +69,8 @@ class CheckboxBase : public ComponentBase, public CheckboxOption {
       return false;
     }
 
-    if (event.mouse().IsPressed()) {
+    if (event.mouse().button == Mouse::Left &&
+        event.mouse().motion == Mouse::Pressed) {
       *checked = !*checked;
       on_change();
       return true;
diff --git a/src/ftxui/component/input.cpp b/src/ftxui/component/input.cpp
index b41a9b4ac12b37582e02a5e077bf1b32ec108998..b0cf92d136b7f26cc722e854c68ebf61deb1270d 100644
--- a/src/ftxui/component/input.cpp
+++ b/src/ftxui/component/input.cpp
@@ -466,7 +466,10 @@ class InputBase : public ComponentBase, public InputOption {
       return false;
     }
 
-    if (!event.mouse().IsPressed()) {
+    if (event.mouse().button != Mouse::Left) {
+      return false;
+    }
+    if (event.mouse().motion != Mouse::Pressed) {
       return false;
     }
 
diff --git a/src/ftxui/component/menu.cpp b/src/ftxui/component/menu.cpp
index 890e500f2900637ca29ccaad395c1a018ce38e75..21a73d893cfdb4bc9e326656056aa5c5a5ec74c0 100644
--- a/src/ftxui/component/menu.cpp
+++ b/src/ftxui/component/menu.cpp
@@ -318,7 +318,9 @@ class MenuBase : public ComponentBase, public MenuOption {
 
       TakeFocus();
       focused_entry() = i;
-      if (event.mouse().IsPressed()) {
+
+      if (event.mouse().button == Mouse::Left &&
+          event.mouse().motion == Mouse::Pressed) {
         if (selected() != i) {
           selected() = i;
           selected_previous_ = selected();
@@ -682,7 +684,8 @@ Component MenuEntry(MenuEntryOption option) {
         return false;
       }
 
-      if (event.mouse().IsPressed()) {
+      if (event.mouse().button == Mouse::Left &&
+          event.mouse().motion == Mouse::Pressed) {
         TakeFocus();
         return true;
       }
diff --git a/src/ftxui/component/mouse.cpp b/src/ftxui/component/mouse.cpp
deleted file mode 100644
index 74e51d2e436625b556bc77f4ecb0cd52951361d8..0000000000000000000000000000000000000000
--- a/src/ftxui/component/mouse.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2023 Arthur Sonzogni. All rights reserved.
-// Use of this source code is governed by the MIT license that can be found in
-// the LICENSE file.
-
-#include "ftxui/component/mouse.hpp"
-
-namespace ftxui {
-
-namespace {
-bool IsDown(const Mouse* mouse, Mouse::Button btn) {
-  return mouse->button == btn && mouse->motion == Mouse::Pressed;
-}
-}  // namespace
-
-/// Return whether the mouse transitionned from released to pressed.
-/// This is useful to detect a click.
-/// @arg btn The button to check.
-bool Mouse::IsPressed(Button btn) const {
-  return IsDown(this, btn) && (!previous || !IsDown(previous, btn));
-}
-
-/// Return whether the mouse is currently held.
-/// This is useful to detect a drag.
-/// @arg btn The button to check.
-bool Mouse::IsHeld(Button btn) const {
-  return IsDown(this, btn) && previous && IsDown(previous, btn);
-}
-
-/// Return whether the mouse transitionned from pressed to released.
-/// This is useful to detect a click.
-/// @arg btn The button to check.
-bool Mouse::IsReleased(Button btn) const {
-  return !IsDown(this, btn) && (previous && IsDown(previous, btn));
-}
-
-}  // namespace ftxui
diff --git a/src/ftxui/component/radiobox.cpp b/src/ftxui/component/radiobox.cpp
index 0d00f403d3b0017fc427395dfed432329017b472..d64e2b886e1b8cb0c8c2be9b43f6ef14ce7096a8 100644
--- a/src/ftxui/component/radiobox.cpp
+++ b/src/ftxui/component/radiobox.cpp
@@ -123,7 +123,8 @@ class RadioboxBase : public ComponentBase, public RadioboxOption {
 
       TakeFocus();
       focused_entry() = i;
-      if (event.mouse().IsPressed()) {
+      if (event.mouse().button == Mouse::Left &&
+          event.mouse().motion == Mouse::Pressed) {
         if (selected() != i) {
           selected() = i;
           on_change();
diff --git a/src/ftxui/component/resizable_split.cpp b/src/ftxui/component/resizable_split.cpp
index 614fd41714bf9a1e65ee221c1ea9a6f51cfbc192..9e0d62e35d1f797341c65dc7d925dcb76f032d50 100644
--- a/src/ftxui/component/resizable_split.cpp
+++ b/src/ftxui/component/resizable_split.cpp
@@ -42,7 +42,8 @@ class ResizableSplitBase : public ComponentBase {
       return true;
     }
 
-    if (event.mouse().IsPressed() &&
+    if (event.mouse().button == Mouse::Left &&
+        event.mouse().motion == Mouse::Pressed &&
         separator_box_.Contain(event.mouse().x, event.mouse().y) &&
         !captured_mouse_) {
       captured_mouse_ = CaptureMouse(event);
diff --git a/src/ftxui/component/screen_interactive.cpp b/src/ftxui/component/screen_interactive.cpp
index 7be7f9136eaa35cbf4c9455093900ce14b6e6d5f..c446f2ee51ff2deceaa69b552aeb89bfb62975ac 100644
--- a/src/ftxui/component/screen_interactive.cpp
+++ b/src/ftxui/component/screen_interactive.cpp
@@ -734,17 +734,11 @@ void ScreenInteractive::HandleTask(Component component, Task& task) {
       if (arg.is_mouse()) {
         arg.mouse().x -= cursor_x_;
         arg.mouse().y -= cursor_y_;
-        arg.mouse().previous = &latest_mouse_event_;
       }
 
       arg.screen_ = this;
       component->OnEvent(arg);
       frame_valid_ = false;
-
-      if (arg.is_mouse()) {
-        latest_mouse_event_ = arg.mouse();
-        latest_mouse_event_.previous = nullptr;
-      }
       return;
     }
 
diff --git a/src/ftxui/component/slider.cpp b/src/ftxui/component/slider.cpp
index 80d29fdb8c3caf608f01c61f1d6b09f79602dd97..bc1a9d689c21e8de60e21b055d8910e7fbc0d825 100644
--- a/src/ftxui/component/slider.cpp
+++ b/src/ftxui/component/slider.cpp
@@ -174,7 +174,10 @@ class SliderBase : public ComponentBase {
       return true;
     }
 
-    if (!event.mouse().IsPressed()) {
+    if (event.mouse().button != Mouse::Left) {
+      return false;
+    }
+    if (event.mouse().motion != Mouse::Pressed) {
       return false;
     }
 
diff --git a/src/ftxui/component/terminal_input_parser.cpp b/src/ftxui/component/terminal_input_parser.cpp
index 7ad3f7040ad9ec557181ed922bbe957f1dbbee4b..cb48604ae850918c6db9b69c96b2031d93e92fd2 100644
--- a/src/ftxui/component/terminal_input_parser.cpp
+++ b/src/ftxui/component/terminal_input_parser.cpp
@@ -410,13 +410,36 @@ TerminalInputParser::Output TerminalInputParser::ParseMouse(  // NOLINT
   (void)altered;
 
   Output output(MOUSE);
-  output.mouse.button = Mouse::Button((arguments[0] & 3) +          // NOLINT
-                                      ((arguments[0] & 64) >> 4));  // NOLINT
-  output.mouse.motion = Mouse::Motion(pressed);                     // NOLINT
-  output.mouse.shift = bool(arguments[0] & 4);                      // NOLINT
-  output.mouse.meta = bool(arguments[0] & 8);                       // NOLINT
-  output.mouse.x = arguments[1];                                    // NOLINT
-  output.mouse.y = arguments[2];                                    // NOLINT
+  output.mouse.motion = Mouse::Motion(pressed);  // NOLINT
+
+  // Bits value Modifer  Comment
+  // ---- ----- ------- ---------
+  // 0 1  1 2   button   0 = Left, 1 = Middle, 2 = Right, 3 = Release
+  // 2    4     Shift
+  // 3    8     Meta
+  // 4    16    Control
+  // 5    32    Move
+  // 6    64    Wheel
+
+  // clang-format off
+  const int button      = arguments[0] & (1 + 2); // NOLINT
+  const bool is_shift   = arguments[0] & 4;       // NOLINT
+  const bool is_meta    = arguments[0] & 8;       // NOLINT
+  const bool is_control = arguments[0] & 16;      // NOLINT
+  const bool is_move    = arguments[0] & 32;      // NOLINT
+  const bool is_wheel   = arguments[0] & 64;      // NOLINT
+  // clang-format on
+
+  output.mouse.motion = is_move ? Mouse::Moved : Mouse::Motion(pressed);
+  output.mouse.button = is_wheel ? Mouse::Button(Mouse::WheelUp + button)  //
+                                 : Mouse::Button(button);
+  output.mouse.shift = is_shift;
+  output.mouse.meta = is_meta;
+  output.mouse.control = is_control;
+  output.mouse.x = arguments[1];  // NOLINT
+  output.mouse.y = arguments[2];  // NOLINT
+
+  // Motion event.
   return output;
 }
 
diff --git a/src/ftxui/component/terminal_input_parser_test.cpp b/src/ftxui/component/terminal_input_parser_test.cpp
index 9e99a349e4e3063b63f91ca42a629859f485b466..9210fdda69bc3a8e65acaf787daf840aa871bb33 100644
--- a/src/ftxui/component/terminal_input_parser_test.cpp
+++ b/src/ftxui/component/terminal_input_parser_test.cpp
@@ -82,8 +82,7 @@ TEST(Event, MouseLeftClickPressed) {
     auto parser = TerminalInputParser(event_receiver->MakeSender());
     parser.Add('\x1B');
     parser.Add('[');
-    parser.Add('3');
-    parser.Add('2');
+    parser.Add('0');
     parser.Add(';');
     parser.Add('1');
     parser.Add('2');
@@ -103,7 +102,7 @@ TEST(Event, MouseLeftClickPressed) {
   EXPECT_FALSE(event_receiver->Receive(&received));
 }
 
-TEST(Event, MouseLeftClickReleased) {
+TEST(Event, MouseLeftMoved) {
   auto event_receiver = MakeReceiver<Task>();
   {
     auto parser = TerminalInputParser(event_receiver->MakeSender());
@@ -117,6 +116,32 @@ TEST(Event, MouseLeftClickReleased) {
     parser.Add(';');
     parser.Add('4');
     parser.Add('2');
+    parser.Add('M');
+  }
+
+  Task received;
+  EXPECT_TRUE(event_receiver->Receive(&received));
+  EXPECT_TRUE(std::get<Event>(received).is_mouse());
+  EXPECT_EQ(Mouse::Left, std::get<Event>(received).mouse().button);
+  EXPECT_EQ(12, std::get<Event>(received).mouse().x);
+  EXPECT_EQ(42, std::get<Event>(received).mouse().y);
+  EXPECT_EQ(std::get<Event>(received).mouse().motion, Mouse::Moved);
+  EXPECT_FALSE(event_receiver->Receive(&received));
+}
+
+TEST(Event, MouseLeftClickReleased) {
+  auto event_receiver = MakeReceiver<Task>();
+  {
+    auto parser = TerminalInputParser(event_receiver->MakeSender());
+    parser.Add('\x1B');
+    parser.Add('[');
+    parser.Add('0');
+    parser.Add(';');
+    parser.Add('1');
+    parser.Add('2');
+    parser.Add(';');
+    parser.Add('4');
+    parser.Add('2');
     parser.Add('m');
   }
 
diff --git a/src/ftxui/component/window.cpp b/src/ftxui/component/window.cpp
index cae72b45637afccda0338a2af38639a00aa8808a..b2b96cebfb6e8d3f9cbebfe53e9199d1918208e6 100644
--- a/src/ftxui/component/window.cpp
+++ b/src/ftxui/component/window.cpp
@@ -225,7 +225,10 @@ class WindowImpl : public ComponentBase, public WindowOptions {
       return true;
     }
 
-    if (!event.mouse().IsPressed()) {
+    if (event.mouse().button != Mouse::Left) {
+      return true;
+    }
+    if (event.mouse().motion != Mouse::Pressed) {
       return true;
     }