when adjusting cursor iterators, always keep them valid
This commit is contained in:
parent
85dbf75b11
commit
5f37229c19
@ -168,23 +168,20 @@ void Buffer::exit_insert_mode()
|
||||
pop_operation();
|
||||
}
|
||||
|
||||
void Buffer::insert_code_point(const Buffer::Iterator & position, uint32_t code_point, bool adjust_iterators)
|
||||
void Buffer::insert_code_point(const Buffer::Iterator & position, uint32_t code_point)
|
||||
{
|
||||
push_operation();
|
||||
Buffer::Iterator local_position = position;
|
||||
if ((code_point != '\n') && (size() == 0u))
|
||||
{
|
||||
insert_code_point(position, '\n', false);
|
||||
insert_code_point(position, '\n');
|
||||
}
|
||||
uint8_t encoded[Encoding::MAX_CODE_POINT_SIZE];
|
||||
uint8_t bytes = Encoding::encode(code_point, m_encoding, encoded);
|
||||
m_gap_buffer->insert(local_position.offset(), encoded, bytes);
|
||||
record_change(encoded, bytes, local_position.offset(), true);
|
||||
ssize_t lines = (code_point == '\n') ? 1 : 0;
|
||||
if (adjust_iterators)
|
||||
{
|
||||
warp_iterators(local_position.offset(), bytes, lines, true);
|
||||
}
|
||||
warp_iterators(local_position.offset(), bytes, lines, true);
|
||||
pop_operation();
|
||||
}
|
||||
|
||||
@ -217,6 +214,13 @@ void Buffer::warp_iterators(size_t offset, ssize_t offset_adjustment, ssize_t li
|
||||
iterator->warp(offset_adjustment, lines_adjustment);
|
||||
}
|
||||
}
|
||||
for (auto cursor : m_cursors)
|
||||
{
|
||||
if ((*cursor == *m_eof_iterator) && (size() > 0u))
|
||||
{
|
||||
cursor->go_back();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Buffer::pop_operation()
|
||||
|
@ -119,7 +119,7 @@ public:
|
||||
void enter_insert_mode();
|
||||
void exit_insert_mode();
|
||||
bool insert_mode() const { return m_insert_mode; }
|
||||
void insert_code_point(const Buffer::Iterator & position, uint32_t code_point, bool adjust_iterators = true);
|
||||
void insert_code_point(const Buffer::Iterator & position, uint32_t code_point);
|
||||
void erase_code_point(const Buffer::Iterator & position);
|
||||
std::string filename() const { return m_filename; }
|
||||
Iterator begin() const { return Iterator(this); }
|
||||
|
Loading…
x
Reference in New Issue
Block a user