From 732a5dc5b6c506103cad8e8e3b1600225d0871e3 Mon Sep 17 00:00:00 2001 From: eidheim Date: Fri, 13 May 2016 09:16:58 +0200 Subject: [PATCH] Terminal links now works with Ninja (#218). Some additional cleanup, including fixing some potential crashes. --- src/project.cc | 16 ++++---------- src/source.cc | 35 +++++++++++++++++++---------- src/source.h | 3 +++ src/terminal.cc | 31 ++++++++++---------------- src/window.cc | 58 +++++++++++-------------------------------------- 5 files changed, 55 insertions(+), 88 deletions(-) diff --git a/src/project.cc b/src/project.cc index bc1e2c1..3f85f60 100644 --- a/src/project.cc +++ b/src/project.cc @@ -380,12 +380,8 @@ void Project::Clang::debug_backtrace() { Debug::Clang::get().select_frame(frame.index); - view->get_buffer()->place_cursor(view->get_buffer()->get_iter_at_line_index(frame.line_nr-1, frame.line_index-1)); - - while(g_main_context_pending(NULL)) - g_main_context_iteration(NULL, false); - if(Notebook::get().get_current_page()!=-1 && Notebook::get().get_current_view()==view) - view->scroll_to(view->get_buffer()->get_insert(), 0.0, 1.0, 0.5); + view->place_cursor_at_line_index(frame.line_nr-1, frame.line_index-1); + view->scroll_to_cursor_delayed(view, true, true); } } }; @@ -420,12 +416,8 @@ void Project::Clang::debug_show_variables() { Debug::Clang::get().select_frame(variable.frame_index, variable.thread_index_id); - view->get_buffer()->place_cursor(view->get_buffer()->get_iter_at_line_index(variable.line_nr-1, variable.line_index-1)); - - while(g_main_context_pending(NULL)) - g_main_context_iteration(NULL, false); - if(Notebook::get().get_current_page()!=-1 && Notebook::get().get_current_view()==view) - view->scroll_to(view->get_buffer()->get_insert(), 0.0, 1.0, 0.5); + view->place_cursor_at_line_index(variable.line_nr-1, variable.line_index-1); + view->scroll_to_cursor_delayed(view, true, true); } } }; diff --git a/src/source.cc b/src/source.cc index 0071038..cd7b4b1 100644 --- a/src/source.cc +++ b/src/source.cc @@ -333,17 +333,8 @@ Source::View::View(const boost::filesystem::path &file_path, Glib::RefPtrset_text(stdout_stream.str()); get_source_buffer()->end_user_action(); - cursor_line_nr=std::min(cursor_line_nr, get_buffer()->get_line_count()-1); - if(cursor_line_nr>=0) { - iter=get_buffer()->get_iter_at_line(cursor_line_nr); - for(int c=0;cplace_cursor(iter); - scroll_to_cursor_delayed(this, true, false); - } + place_cursor_at_line_offset(cursor_line_nr, cursor_line_offset); + scroll_to_cursor_delayed(this, true, false); } }; } @@ -799,6 +790,28 @@ Gtk::TextIter Source::View::get_iter_for_dialog() { return iter; } +void Source::View::place_cursor_at_line_offset(int line, int offset) { + line=std::min(line, get_buffer()->get_line_count()-1); + if(line<0) + line=0; + auto iter=get_buffer()->get_iter_at_line(line); + while(!iter.ends_line()) + iter.forward_char(); + offset=std::min(offset, iter.get_line_offset()); + get_buffer()->place_cursor(get_buffer()->get_iter_at_line_offset(line, offset)); +} + +void Source::View::place_cursor_at_line_index(int line, int index) { + line=std::min(line, get_buffer()->get_line_count()-1); + if(line<0) + line=0; + auto iter=get_buffer()->get_iter_at_line(line); + while(!iter.ends_line()) + iter.forward_char(); + index=std::min(index, iter.get_line_index()); + get_buffer()->place_cursor(get_buffer()->get_iter_at_line_index(line, index)); +} + void Source::View::set_status(const std::string &status) { this->status=status; if(on_update_status) diff --git a/src/source.h b/src/source.h index 9ee69b9..7a8ac4a 100644 --- a/src/source.h +++ b/src/source.h @@ -104,6 +104,9 @@ namespace Source { sigc::connection delayed_tooltips_connection; std::function scroll_to_cursor_delayed=[](View* view, bool center, bool show_tooltips) {}; + void place_cursor_at_line_offset(int line, int offset); + void place_cursor_at_line_index(int line, int index); + std::function on_update_status; std::function on_update_info; void set_status(const std::string &status); diff --git a/src/terminal.cc b/src/terminal.cc index 78fca84..764916f 100644 --- a/src/terminal.cc +++ b/src/terminal.cc @@ -340,6 +340,7 @@ void Terminal::clear() { } bool Terminal::on_button_press_event(GdkEventButton* button_event) { + //open clicked link in terminal if(button_event->type==GDK_BUTTON_PRESS && button_event->button==GDK_BUTTON_PRIMARY) { Gtk::TextIter iter; int location_x, location_y; @@ -350,34 +351,24 @@ bool Terminal::on_button_press_event(GdkEventButton* button_event) { if(iter.has_tag(link_tag) && start_iter.backward_to_tag_toggle(link_tag) && end_iter.forward_to_tag_toggle(link_tag)) { std::string path_str=get_buffer()->get_text(start_iter, end_iter); -#ifdef _WIN32 - const static REGEX_NS::regex path_regex("^([A-Z]:[^:]+):([0-9]+):([0-9]+)$"); -#else - const static REGEX_NS::regex path_regex("^([^:]+):([0-9]+):([0-9]+)$"); -#endif + const static REGEX_NS::regex path_regex("^([A-Z]:)?([^:]+):([0-9]+):([0-9]+)$"); REGEX_NS::smatch sm; if(REGEX_NS::regex_match(path_str, sm, path_regex)) { + auto path_str=sm[1].str()+sm[2].str(); boost::system::error_code ec; - auto path=boost::filesystem::canonical(sm[1].str(), ec); + auto path=boost::filesystem::canonical(path_str, ec); + if(ec) + path=boost::filesystem::canonical(Project::current_language->build->get_default_build_path()/path_str, ec); if(!ec && boost::filesystem::is_regular_file(path)) { Notebook::get().open(path); if(Notebook::get().get_current_page()!=-1) { auto view=Notebook::get().get_current_view(); try { - int line = std::stoi(sm[2].str())-1; - int index = std::stoi(sm[3].str())-1; - line=std::min(line, view->get_buffer()->get_line_count()-1); - if(line>=0) { - auto iter=view->get_buffer()->get_iter_at_line(line); - while(!iter.ends_line()) - iter.forward_char(); - auto end_line_index=iter.get_line_index(); - index=std::min(index, end_line_index); - - view->get_buffer()->place_cursor(view->get_buffer()->get_iter_at_line_index(line, index)); - view->scroll_to_cursor_delayed(view, true, true); - return true; - } + int line = std::stoi(sm[3].str())-1; + int index = std::stoi(sm[4].str())-1; + view->place_cursor_at_line_index(line, index); + view->scroll_to_cursor_delayed(view, true, true); + return true; } catch(const std::exception &) {} } diff --git a/src/window.cc b/src/window.cc index ff52611..12e28f6 100644 --- a/src/window.cc +++ b/src/window.cc @@ -437,20 +437,11 @@ void Window::set_menu_actions() { if(ec) return; notebook.open(declaration_file); + auto view=notebook.get_current_view(); auto line=static_cast(location.line)-1; auto index=static_cast(location.index)-1; - auto view=notebook.get_current_view(); - line=std::min(line, view->get_buffer()->get_line_count()-1); - if(line>=0) { - auto iter=view->get_buffer()->get_iter_at_line(line); - while(!iter.ends_line()) - iter.forward_char(); - auto end_line_index=iter.get_line_index(); - index=std::min(index, end_line_index); - - view->get_buffer()->place_cursor(view->get_buffer()->get_iter_at_line_index(line, index)); - view->scroll_to_cursor_delayed(view, true, false); - } + view->place_cursor_at_line_index(line, index); + view->scroll_to_cursor_delayed(view, true, false); } } } @@ -472,20 +463,11 @@ void Window::set_menu_actions() { if(ec) return; notebook.open(implementation_path); + auto view=notebook.get_current_view(); auto line=static_cast(location.line)-1; auto index=static_cast(location.index)-1; - auto view=notebook.get_current_view(); - line=std::min(line, view->get_buffer()->get_line_count()-1); - if(line>=0) { - auto iter=view->get_buffer()->get_iter_at_line(line); - while(!iter.ends_line()) - iter.forward_char(); - auto end_line_index=iter.get_line_index(); - index=std::min(index, end_line_index); - - view->get_buffer()->place_cursor(view->get_buffer()->get_iter_at_line_index(line, index)); - view->scroll_to_cursor_delayed(view, true, false); - } + view->place_cursor_at_line_index(line, index); + view->scroll_to_cursor_delayed(view, true, false); return; } } @@ -540,7 +522,7 @@ void Window::set_menu_actions() { return; notebook.open(declaration_file); auto view=notebook.get_current_view(); - view->get_buffer()->place_cursor(view->get_buffer()->get_iter_at_line_index(offset.line, offset.index)); + view->place_cursor_at_line_index(offset.line, offset.index); view->scroll_to(view->get_buffer()->get_insert(), 0.0, 1.0, 0.5); view->delayed_tooltips_connection.disconnect(); }; @@ -775,19 +757,10 @@ void Window::set_menu_actions() { if(notebook.get_current_page()!=-1) { auto view=notebook.get_current_view(); - int line_nr=Project::debug_stop.second.first-1; - int line_index=Project::debug_stop.second.second-1; - if(line_nrget_buffer()->get_line_count()) { - auto iter=view->get_buffer()->get_iter_at_line(line_nr); - auto end_line_iter=iter; - while(!iter.ends_line() && iter.forward_char()) {} - auto line=view->get_buffer()->get_text(iter, end_line_iter); - if(static_cast(line_index)>=line.bytes()) - line_index=0; - view->get_buffer()->place_cursor(view->get_buffer()->get_iter_at_line_index(line_nr, line_index)); - - view->scroll_to_cursor_delayed(view, true, true); - } + int line=Project::debug_stop.second.first-1; + int index=Project::debug_stop.second.second-1; + view->place_cursor_at_line_index(line, index); + view->scroll_to_cursor_delayed(view, true, true); Project::debug_update_stop(); } } @@ -1089,13 +1062,8 @@ void Window::goto_line_entry() { if(notebook.get_current_page()!=-1) { auto view=notebook.get_current_view(); try { - auto line = stoi(content); - if(line>0 && line<=view->get_buffer()->get_line_count()) { - line--; - - view->get_buffer()->place_cursor(view->get_buffer()->get_iter_at_line(line)); - view->scroll_to_cursor_delayed(view, true, false); - } + view->place_cursor_at_line_index(stoi(content)-1, 0); + view->scroll_to_cursor_delayed(view, true, false); } catch(const std::exception &e) {} EntryBox::get().hide();