From 32a27c91b111f85d7deefffc86b9909408e866fe Mon Sep 17 00:00:00 2001 From: eidheim Date: Tue, 1 Sep 2015 13:19:26 +0200 Subject: [PATCH] Trying to find where juci crashes about once a day on OS X. Also fixed tooltip-newlines. --- src/directories.cc | 10 +++++++ src/notebook.cc | 18 ++++++------ src/selectiondialog.cc | 9 ++++-- src/source.cc | 62 +++++++++++++++++++----------------------- src/sourcefile.cc | 4 +-- src/terminal.cc | 9 +++--- src/tooltips.cc | 23 ++++++++-------- src/window.cc | 6 ++-- 8 files changed, 75 insertions(+), 66 deletions(-) diff --git a/src/directories.cc b/src/directories.cc index 00332cc..8bfbdda 100644 --- a/src/directories.cc +++ b/src/directories.cc @@ -68,6 +68,7 @@ Directories::Directories() : stop_update_thread(false) { }); update_dispatcher.connect([this](){ + DEBUG("start"); update_mutex.lock(); for(auto &path: update_paths) { if(last_write_times.count(path)>0) @@ -75,11 +76,13 @@ Directories::Directories() : stop_update_thread(false) { } update_paths.clear(); update_mutex.unlock(); + DEBUG("end"); }); update_thread=std::thread([this](){ while(!stop_update_thread) { std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + DEBUG("start"); update_mutex.lock(); if(update_paths.size()==0) { for(auto it=last_write_times.begin();it!=last_write_times.end();) { @@ -101,6 +104,7 @@ Directories::Directories() : stop_update_thread(false) { update_dispatcher(); } update_mutex.unlock(); + DEBUG("end"); } }); } @@ -138,14 +142,17 @@ void Directories::open(const boost::filesystem::path& dir_path) { } void Directories::update() { + DEBUG("start"); update_mutex.lock(); for(auto &last_write_time: last_write_times) { add_path(last_write_time.first, last_write_time.second.first); } update_mutex.unlock(); + DEBUG("end"); } void Directories::select(const boost::filesystem::path &path) { + DEBUG("start"); if(current_path=="") return; @@ -185,6 +192,7 @@ void Directories::select(const boost::filesystem::path &path) { } return false; }); + DEBUG("end"); } bool Directories::ignored(std::string path) { @@ -204,6 +212,7 @@ bool Directories::ignored(std::string path) { } void Directories::add_path(const boost::filesystem::path& dir_path, const Gtk::TreeModel::Row &parent) { + DEBUG("start"); last_write_times[dir_path.string()]={parent, boost::filesystem::last_write_time(dir_path)}; std::unique_ptr children; //Gtk::TreeNodeChildren is missing default constructor... if(parent) @@ -257,4 +266,5 @@ void Directories::add_path(const boost::filesystem::path& dir_path, const Gtk::T auto child=tree_store->append(*children); child->set_value(column_record.name, std::string("(empty)")); } + DEBUG("end"); } diff --git a/src/notebook.cc b/src/notebook.cc index 4462d69..a733cd9 100644 --- a/src/notebook.cc +++ b/src/notebook.cc @@ -28,15 +28,11 @@ int Notebook::size() { } Source::View* Notebook::get_view(int page) { - if(page>=size()) - return nullptr; return source_views.at(page); } Source::View* Notebook::get_current_view() { INFO("Getting sourceview"); - if(get_current_page()==-1) - return nullptr; return get_view(get_current_page()); } @@ -163,25 +159,29 @@ bool Notebook::save_current() { } bool Notebook::close_current_page() { + DEBUG("start"); INFO("Notebook close page"); - if (size() != 0) { + if (get_current_page()!=-1) { if(get_current_view()->get_buffer()->get_modified()){ - if(!save_modified_dialog()) + if(!save_modified_dialog()) { + DEBUG("end false"); return false; + } } int page = get_current_page(); remove_page(page); if(get_current_page()==-1) Singleton::status()->set_text(""); auto source_view=source_views.at(page); - source_views.erase(source_views.begin()+ page); - scrolled_windows.erase(scrolled_windows.begin()+page); - hboxes.erase(hboxes.begin()+page); if(auto source_clang_view=dynamic_cast(source_view)) source_clang_view->async_delete(); else delete source_view; + source_views.erase(source_views.begin()+ page); + scrolled_windows.erase(scrolled_windows.begin()+page); + hboxes.erase(hboxes.begin()+page); } + DEBUG("end true"); return true; } diff --git a/src/selectiondialog.cc b/src/selectiondialog.cc index 816041a..e6742e9 100644 --- a/src/selectiondialog.cc +++ b/src/selectiondialog.cc @@ -210,7 +210,8 @@ void SelectionDialog::show() { else { auto last_it=list_view_text.get_model()->children().end(); last_it--; - list_view_text.set_cursor(list_view_text.get_model()->get_path(last_it)); + if(last_it) + list_view_text.set_cursor(list_view_text.get_model()->get_path(last_it)); } return true; } @@ -269,7 +270,8 @@ bool SelectionDialog::on_key_press(GdkEventKey* key) { else { auto last_it=list_view_text.get_model()->children().end(); last_it--; - list_view_text.set_cursor(list_view_text.get_model()->get_path(last_it)); + if(last_it) + list_view_text.set_cursor(list_view_text.get_model()->get_path(last_it)); } return true; } @@ -418,7 +420,8 @@ bool CompletionDialog::on_key_press(GdkEventKey* key) { else { auto last_it=list_view_text.get_model()->children().end(); last_it--; - list_view_text.set_cursor(list_view_text.get_model()->get_path(last_it)); + if(last_it) + list_view_text.set_cursor(list_view_text.get_model()->get_path(last_it)); } select(false); update_tooltips(); diff --git a/src/source.cc b/src/source.cc index 41d9fbf..abcd2dc 100644 --- a/src/source.cc +++ b/src/source.cc @@ -485,8 +485,7 @@ void Source::View::set_status(const std::string &status) { string Source::View::get_line(size_t line_number) { Gtk::TextIter line_it = get_source_buffer()->get_iter_at_line(line_number); Gtk::TextIter line_end_it = line_it; - while(!line_end_it.ends_line()) - line_end_it++; + while(!line_end_it.ends_line() && line_end_it.forward_char()) {} std::string line(get_source_buffer()->get_text(line_it, line_end_it)); return line; } @@ -516,14 +515,15 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { if((line_nr+1)get_line_count()) { string next_line=get_line(line_nr+1); auto line_end_iter=get_buffer()->get_iter_at_line(line_nr+1); - line_end_iter--; - std::smatch sm2; - if(insert_it==line_end_iter && std::regex_match(next_line, sm2, tabs_regex)) { - if(sm2[1].str().size()>sm[1].str().size()) { - get_source_buffer()->insert_at_cursor("\n"+sm2[1].str()); - scroll_to(get_source_buffer()->get_insert()); - get_source_buffer()->end_user_action(); - return true; + if(line_end_iter.backward_char()) { + std::smatch sm2; + if(insert_it==line_end_iter && std::regex_match(next_line, sm2, tabs_regex)) { + if(sm2[1].str().size()>sm[1].str().size()) { + get_source_buffer()->insert_at_cursor("\n"+sm2[1].str()); + scroll_to(get_source_buffer()->get_insert()); + get_source_buffer()->end_user_action(); + return true; + } } } } @@ -570,9 +570,8 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { Gtk::TextIter line_it = get_source_buffer()->get_iter_at_line(line_nr); Gtk::TextIter line_plus_it=line_it; - for(unsigned c=0;cerase(line_it, line_plus_it); + if(indent_left_steps==0 || line_plus_it.forward_chars(indent_left_steps)) + get_source_buffer()->erase(line_it, line_plus_it); } get_source_buffer()->end_user_action(); return true; @@ -590,10 +589,8 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { if(std::regex_match(previous_line, sm2, tabs_regex)) { if(line.size()==sm2[1].str().size() || line.size()==sm2[1].str().size()+tab_size || line.size()==sm2[1].str().size()-tab_size) { auto previous_line_end_it=insert_it; - for(unsigned c=0;cerase(previous_line_end_it, insert_it); + if(previous_line_end_it.backward_chars(line.size()+1)) + get_source_buffer()->erase(previous_line_end_it, insert_it); get_source_buffer()->end_user_action(); return true; } @@ -601,9 +598,8 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { } if(line.size()>=tab_size) { auto insert_minus_tab_it=insert_it; - for(unsigned c=0;cerase(insert_minus_tab_it, insert_it); + if(tab_size==0 || insert_minus_tab_it.backward_chars(tab_size)) + get_source_buffer()->erase(insert_minus_tab_it, insert_it); get_source_buffer()->end_user_action(); return true; } @@ -1097,20 +1093,20 @@ bool Source::ClangViewParse::on_key_press_event(GdkEventKey* key) { if(next_char!='}' && next_line.substr(0, next_line_with_end_bracket.size())!=next_line_with_end_bracket) { get_source_buffer()->insert_at_cursor("\n"+sm[1].str()+tab+"\n"+sm[1].str()+"}"); auto insert_it = get_source_buffer()->get_insert()->get_iter(); - for(size_t c=0;cget_insert()); - get_source_buffer()->place_cursor(insert_it); + if(insert_it.backward_chars(sm[1].str().size()+2)) { + scroll_to(get_source_buffer()->get_insert()); + get_source_buffer()->place_cursor(insert_it); + } get_source_buffer()->end_user_action(); return true; } else if(next_char=='}') { get_source_buffer()->insert_at_cursor("\n"+sm[1].str()+tab+"\n"+sm[1].str()); auto insert_it = get_source_buffer()->get_insert()->get_iter(); - for(size_t c=0;cget_insert()); - get_source_buffer()->place_cursor(insert_it); + if(insert_it.backward_chars(sm[1].str().size()+1)) { + scroll_to(get_source_buffer()->get_insert()); + get_source_buffer()->place_cursor(insert_it); + } get_source_buffer()->end_user_action(); return true; } @@ -1170,10 +1166,8 @@ bool Source::ClangViewParse::on_key_press_event(GdkEventKey* key) { Gtk::TextIter insert_it = get_source_buffer()->get_insert()->get_iter(); Gtk::TextIter line_it = get_source_buffer()->get_iter_at_line(insert_it.get_line()); Gtk::TextIter line_plus_it=line_it; - for(unsigned c=0;cerase(line_it, line_plus_it); + if(tab_size==0 || line_plus_it.forward_chars(tab_size)) + get_source_buffer()->erase(line_it, line_plus_it); } get_source_buffer()->insert_at_cursor("}"); get_source_buffer()->end_user_action(); @@ -1285,8 +1279,8 @@ void Source::ClangViewAutocomplete::autocomplete() { autocomplete_starting=false; if(!autocomplete_cancel_starting) { auto start_iter=get_buffer()->get_insert()->get_iter(); - for(size_t c=0;c0 && !start_iter.backward_chars(prefix.size())) + return; completion_dialog=std::unique_ptr(new CompletionDialog(*this, get_buffer()->create_mark(start_iter))); auto rows=std::make_shared >(); completion_dialog->on_hide=[this](){ diff --git a/src/sourcefile.cc b/src/sourcefile.cc index 260a5fb..b853796 100644 --- a/src/sourcefile.cc +++ b/src/sourcefile.cc @@ -70,9 +70,7 @@ bool juci::filesystem::write(const std::string &path, Glib::RefPtrinsert_with_tag(get_buffer()->end(), message, bold_tag); else @@ -293,15 +293,16 @@ int Terminal::print(const std::string &message, bool bold){ get_buffer()->delete_mark(mark); } + DEBUG("end"); return get_buffer()->end().get_line(); } void Terminal::print(int line_nr, const std::string &message){ - INFO("Terminal: PrintMessage at line " << line_nr); + DEBUG("start"); auto iter=get_buffer()->get_iter_at_line(line_nr); - while(!iter.ends_line()) - iter++; + while(!iter.ends_line() && iter.forward_char()) {} get_buffer()->insert(iter, message); + DEBUG("end"); } std::shared_ptr Terminal::print_in_progress(std::string start_msg) { diff --git a/src/tooltips.cc b/src/tooltips.cc index 21696ef..20d2dcb 100644 --- a/src/tooltips.cc +++ b/src/tooltips.cc @@ -1,6 +1,9 @@ #include "tooltips.h" #include "singletons.h" +#include +using namespace std; + namespace sigc { template struct functor_trait { @@ -28,12 +31,10 @@ void Tooltip::update() { auto end_iter=end_mark->get_iter(); text_view.get_iter_location(iter, activation_rectangle); if(iter.get_offset() text_buffer) { last_space=iter; if(*iter=='\n') { end=true; - iter++; + iter.forward_char(); break; } - iter++; + iter.forward_char(); } if(!end) { while(!last_space && iter) { //If no space (word longer than 80) - iter++; + iter.forward_char(); if(iter && *iter==' ') last_space=iter; } if(iter && last_space) { auto mark=text_buffer->create_mark(last_space); - auto iter_mark=text_buffer->create_mark(iter); - auto last_space_p=last_space++; - text_buffer->erase(last_space, last_space_p); + auto last_space_p=last_space; + last_space.forward_char(); + text_buffer->erase(last_space_p, last_space); text_buffer->insert(mark->get_iter(), "\n"); - iter=iter_mark->get_iter(); + iter=mark->get_iter(); + iter.forward_char(); text_buffer->delete_mark(mark); - text_buffer->delete_mark(iter_mark); } } } diff --git a/src/window.cc b/src/window.cc index f831b51..188defb 100644 --- a/src/window.cc +++ b/src/window.cc @@ -214,7 +214,8 @@ void Window::create_menu() { if(notebook.get_current_page()!=-1) { while(gtk_events_pending()) gtk_main_iteration(); - notebook.get_current_view()->scroll_to(notebook.get_current_view()->get_buffer()->get_insert(), 0.0, 1.0, 0.5); + if(notebook.get_current_page()!=-1) + notebook.get_current_view()->scroll_to(notebook.get_current_view()->get_buffer()->get_insert(), 0.0, 1.0, 0.5); } }); menu.action_group->add(Gtk::Action::create("SourceGotoDeclaration", "Go to Declaration"), Gtk::AccelKey(menu.key_map["source_goto_declaration"]), [this]() { @@ -226,7 +227,8 @@ void Window::create_menu() { notebook.get_current_view()->get_buffer()->place_cursor(notebook.get_current_view()->get_buffer()->get_iter_at_line_index(location.second.line-1, location.second.index-1)); while(gtk_events_pending()) gtk_main_iteration(); - notebook.get_current_view()->scroll_to(notebook.get_current_view()->get_buffer()->get_insert(), 0.0, 1.0, 0.5); + if(notebook.get_current_page()!=-1) + notebook.get_current_view()->scroll_to(notebook.get_current_view()->get_buffer()->get_insert(), 0.0, 1.0, 0.5); } } }