From d4f72430cb5e6c8e83e3573b8d2bbe9c0128c377 Mon Sep 17 00:00:00 2001 From: eidheim Date: Tue, 1 Dec 2015 21:05:58 +0100 Subject: [PATCH] Fixed a crash when pressing enter at the first line when having a space at the end. Also a minor fix if one press enter at the last line. --- src/source.cc | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/source.cc b/src/source.cc index 0feff40..983ae28 100644 --- a/src/source.cc +++ b/src/source.cc @@ -143,8 +143,7 @@ Source::View::View(const boost::filesystem::path &file_path, const boost::filesy auto first=iter; auto second=iter; if(last_keyval_is_return) { - while(first && !first.ends_line()) - first.backward_char(); + while(first && !first.ends_line() && first.backward_char()) {} if(first.backward_char() && second.forward_char()) { get_buffer()->remove_tag_by_name("spellcheck_error", first, second); auto word=spellcheck_get_word(first); @@ -947,35 +946,34 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { while((*end_blank_iter==' ' || *end_blank_iter=='\t') && !end_blank_iter.ends_line() && end_blank_iter.forward_char()) {} start_blank_iter.backward_char(); - while((*start_blank_iter==' ' || *start_blank_iter=='\t' || start_blank_iter.ends_line()) && + while((*start_blank_iter==' ' || *start_blank_iter=='\t') && !start_blank_iter.starts_line() && start_blank_iter.backward_char()) {} - if(!start_blank_iter.starts_line()) { + + if(start_blank_iter.starts_line() && (*start_blank_iter==' ' || *start_blank_iter=='\t')) + get_buffer()->erase(iter, end_blank_iter); + else { start_blank_iter.forward_char(); get_buffer()->erase(start_blank_iter, end_blank_iter); } - else - get_buffer()->erase(iter, end_blank_iter); - iter=get_buffer()->get_insert()->get_iter(); + iter=get_buffer()->get_insert()->get_iter(); int line_nr=iter.get_line(); auto tabs_end_iter=get_tabs_end_iter(); auto line_tabs=get_line_before(tabs_end_iter); if((line_nr+1)get_line_count()) { auto next_line_tabs_end_iter=get_tabs_end_iter(line_nr+1); auto next_line_tabs=get_line_before(next_line_tabs_end_iter); - if(iter.ends_line()) { - if(next_line_tabs.size()>line_tabs.size()) { - get_source_buffer()->insert_at_cursor("\n"+next_line_tabs); - scroll_to(get_source_buffer()->get_insert()); - get_source_buffer()->end_user_action(); - return true; - } + if(iter.ends_line() && next_line_tabs.size()>line_tabs.size()) { + get_source_buffer()->insert_at_cursor("\n"+next_line_tabs); + scroll_to(get_source_buffer()->get_insert()); + get_source_buffer()->end_user_action(); + return true; } - get_source_buffer()->insert_at_cursor("\n"+line_tabs); - scroll_to(get_source_buffer()->get_insert()); - get_source_buffer()->end_user_action(); - return true; } + get_source_buffer()->insert_at_cursor("\n"+line_tabs); + scroll_to(get_source_buffer()->get_insert()); + get_source_buffer()->end_user_action(); + return true; } //Indent right when clicking tab, no matter where in the line the cursor is. Also works on selected text. else if(key->keyval==GDK_KEY_Tab) {