Explorar el Código

refactor(gtk): unify mode switching and history reset

Refactored handle_editor_event to clean up repetitive code and ensure that history_index_ is correctly reset when entering minibuffer modes, preventing stale history navigation.
Bernardo Magri hace 1 mes
padre
commit
216a89ad0d
Se han modificado 1 ficheros con 14 adiciones y 16 borrados
  1. 14 16
      src/gtk_editor.cpp

+ 14 - 16
src/gtk_editor.cpp

@@ -66,7 +66,6 @@ public:
         // Safety check during destruction
         if (!core_ || !app_) return;
 
-
         // Handle layout changes
         if (event == EditorEvent::WindowLayoutChanged) {
             rebuild_layout();
@@ -77,32 +76,24 @@ public:
             queue_redraw_all_windows(content_widget_);
         }
 
+        bool mode_changed = false;
+
         // Handle mode switching events
         if (event == EditorEvent::CommandMode) {
             mode_ = Mode::Command;
-            command_buffer_.clear();
-            message_line_.clear();
-            if (drawing_area_) drawing_area_->queue_draw();
+            mode_changed = true;
         } else if (event == EditorEvent::FindFileMode) {
             mode_ = Mode::FindFile;
-            command_buffer_.clear();
-            message_line_.clear();
-            if (drawing_area_) drawing_area_->queue_draw();
+            mode_changed = true;
         } else if (event == EditorEvent::BufferSwitchMode) {
             mode_ = Mode::BufferSwitch;
-            command_buffer_.clear();
-            message_line_.clear();
-            if (drawing_area_) drawing_area_->queue_draw();
+            mode_changed = true;
         } else if (event == EditorEvent::KillBufferMode) {
             mode_ = Mode::KillBuffer;
-            command_buffer_.clear();
-            message_line_.clear();
-            if (drawing_area_) drawing_area_->queue_draw();
+            mode_changed = true;
         } else if (event == EditorEvent::ISearchMode) {
             mode_ = Mode::ISearch;
-            command_buffer_.clear();
-            message_line_.clear();
-            if (drawing_area_) drawing_area_->queue_draw();
+            mode_changed = true;
         } else if (event == EditorEvent::Quit) {
             // Disconnect timer before quitting to prevent segfault
             if (cursor_timer_connection_.connected()) {
@@ -115,6 +106,13 @@ public:
                 }
             });
         }
+        
+        if (mode_changed) {
+            command_buffer_.clear();
+            message_line_.clear();
+            history_index_ = minibuffer_history_.size(); // Reset history index to end (new input)
+            if (content_widget_) queue_redraw_all_windows(content_widget_);
+        }
     }
 
     void set_core(EditorCore* core) override {