Browse Source

Terminal links now works with Ninja (#218). Some additional cleanup, including fixing some potential crashes.

merge-requests/365/head
eidheim 10 years ago
parent
commit
732a5dc5b6
  1. 16
      src/project.cc
  2. 35
      src/source.cc
  3. 3
      src/source.h
  4. 31
      src/terminal.cc
  5. 58
      src/window.cc

16
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);
}
}
};

35
src/source.cc

@ -333,17 +333,8 @@ Source::View::View(const boost::filesystem::path &file_path, Glib::RefPtr<Gsv::L
get_buffer()->set_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;c<cursor_line_offset;c++) {
if(iter.ends_line())
break;
iter.forward_char();
}
get_buffer()->place_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)

3
src/source.h

@ -104,6 +104,9 @@ namespace Source {
sigc::connection delayed_tooltips_connection;
std::function<void(View* view, bool center, bool show_tooltips)> 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<void(View* view, const std::string &status_text)> on_update_status;
std::function<void(View* view, const std::string &info_text)> on_update_info;
void set_status(const std::string &status);

31
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 &) {}
}

58
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<int>(location.line)-1;
auto index=static_cast<int>(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<int>(location.line)-1;
auto index=static_cast<int>(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_nr<view->get_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<size_t>(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();

Loading…
Cancel
Save