diff --git a/src/core/Buffer.cc b/src/core/Buffer.cc index c01dc45..e13de1c 100644 --- a/src/core/Buffer.cc +++ b/src/core/Buffer.cc @@ -153,13 +153,8 @@ bool Buffer::write_to_file(const char * filename) return true; } -void Buffer::enter_insert_mode(const Buffer::Iterator & position) +void Buffer::enter_insert_mode() { - m_insert_position = position.offset(); - if (m_insert_position > m_gap_buffer->size()) - { - m_insert_position = 0; - } m_insert_mode = true; } @@ -168,28 +163,28 @@ void Buffer::exit_insert_mode() m_insert_mode = false; } -void Buffer::insert_code_point(uint32_t code_point, bool adjust_iterators) +void Buffer::insert_code_point(const Buffer::Iterator & position, uint32_t code_point, bool adjust_iterators) { if (m_insert_mode) { + Buffer::Iterator local_position = position; if ((code_point != '\n') && (size() == 0u)) { - insert_code_point('\n', false); + insert_code_point(position, '\n', false); } uint8_t encoded[Encoding::MAX_CODE_POINT_SIZE]; uint8_t bytes = Encoding::encode(code_point, m_encoding, encoded); - m_gap_buffer->insert(m_insert_position, encoded, bytes); + m_gap_buffer->insert(local_position.offset(), encoded, bytes); ssize_t lines = (code_point == '\n') ? 1 : 0; if (adjust_iterators) { for (auto iterator : m_iterators) { - if (iterator->offset() >= m_insert_position) + if (*iterator >= local_position) { iterator->warp(bytes, lines); } } - m_insert_position += bytes; } } } @@ -198,20 +193,17 @@ void Buffer::erase_code_point(const Buffer::Iterator & position) { if (position.valid()) { + Buffer::Iterator local_position = position; uint8_t bytes = 0u; - uint32_t code_point = Encoding::decode(m_encoding, position.address(), &bytes); - m_gap_buffer->erase(position.offset(), bytes); + uint32_t code_point = Encoding::decode(m_encoding, local_position.address(), &bytes); + m_gap_buffer->erase(local_position.offset(), bytes); ssize_t lines = (code_point == '\n') ? -1 : 0; for (auto iterator : m_iterators) { - if (*iterator > position) + if (*iterator > local_position) { iterator->warp(-(ssize_t)bytes, lines); } } - if (m_insert_position > position.offset()) - { - m_insert_position -= bytes; - } } } diff --git a/src/core/Buffer.h b/src/core/Buffer.h index 5b94ecb..8e9bde8 100644 --- a/src/core/Buffer.h +++ b/src/core/Buffer.h @@ -108,10 +108,10 @@ public: uint8_t * address(size_t offset) const { return m_gap_buffer->address(offset); } Encoding::Type encoding() const { return m_encoding; } uint8_t tabstop() const { return m_tabstop; } - void enter_insert_mode(const Buffer::Iterator & position); + void enter_insert_mode(); void exit_insert_mode(); bool insert_mode() const { return m_insert_mode; } - void insert_code_point(uint32_t code_point, bool adjust_iterators = true); + void insert_code_point(const Buffer::Iterator & position, uint32_t code_point, bool adjust_iterators = true); void erase_code_point(const Buffer::Iterator & position); std::string filename() const { return m_filename; } Iterator begin() const { return Iterator(this); } @@ -124,7 +124,6 @@ protected: Encoding::Type m_encoding; uint8_t m_tabstop; bool m_insert_mode; - size_t m_insert_position; std::list> m_iterators; std::shared_ptr m_eof_iterator; std::string m_filename; diff --git a/src/gui/BufferPane.cc b/src/gui/BufferPane.cc index 78339fe..8c2d022 100644 --- a/src/gui/BufferPane.cc +++ b/src/gui/BufferPane.cc @@ -431,7 +431,7 @@ void BufferPane::insert_code_point(uint32_t code_point) code_point = '\n'; m_cursor_screen_row++; } - m_buffer->insert_code_point(code_point); + m_buffer->insert_code_point(*m_iterator, code_point); } m_window->request_redraw(); } @@ -573,14 +573,14 @@ void BufferPane::enter_insert_mode(Window::EnterInsertModeMode which) switch (which) { case Window::EnterInsertModeMode::START_OF_CHAR: - m_buffer->enter_insert_mode(*m_iterator); + m_buffer->enter_insert_mode(); break; case Window::EnterInsertModeMode::END_OF_CHAR: if (**m_iterator != '\n') { m_iterator->go_forward(); } - m_buffer->enter_insert_mode(*m_iterator); + m_buffer->enter_insert_mode(); break; case Window::EnterInsertModeMode::START_OF_LINE: m_iterator->go_start_of_line(); @@ -592,16 +592,16 @@ void BufferPane::enter_insert_mode(Window::EnterInsertModeMode which) break; case Window::EnterInsertModeMode::NEW_LINE_BEFORE: m_iterator->go_start_of_line(); - m_buffer->enter_insert_mode(*m_iterator); - m_buffer->insert_code_point('\n'); + m_buffer->enter_insert_mode(); + m_buffer->insert_code_point(*m_iterator, '\n'); m_buffer->exit_insert_mode(); cursor_move(Window::CursorMovement::UP); enter_insert_mode(Window::EnterInsertModeMode::START_OF_CHAR); break; case Window::EnterInsertModeMode::NEW_LINE_AFTER: m_iterator->go_end_of_line(true); - m_buffer->enter_insert_mode(*m_iterator); - m_buffer->insert_code_point('\n'); + m_buffer->enter_insert_mode(); + m_buffer->insert_code_point(*m_iterator, '\n'); break; }