Browse Source

Trying to find where juci crashes about once a day on OS X. Also fixed tooltip-newlines.

merge-requests/365/head
eidheim 10 years ago
parent
commit
32a27c91b1
  1. 10
      src/directories.cc
  2. 18
      src/notebook.cc
  3. 3
      src/selectiondialog.cc
  4. 32
      src/source.cc
  5. 4
      src/sourcefile.cc
  6. 9
      src/terminal.cc
  7. 23
      src/tooltips.cc
  8. 2
      src/window.cc

10
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<Gtk::TreeNodeChildren> 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");
}

18
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::ClangView*>(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;
}

3
src/selectiondialog.cc

@ -210,6 +210,7 @@ void SelectionDialog::show() {
else {
auto last_it=list_view_text.get_model()->children().end();
last_it--;
if(last_it)
list_view_text.set_cursor(list_view_text.get_model()->get_path(last_it));
}
return true;
@ -269,6 +270,7 @@ bool SelectionDialog::on_key_press(GdkEventKey* key) {
else {
auto last_it=list_view_text.get_model()->children().end();
last_it--;
if(last_it)
list_view_text.set_cursor(list_view_text.get_model()->get_path(last_it));
}
return true;
@ -418,6 +420,7 @@ bool CompletionDialog::on_key_press(GdkEventKey* key) {
else {
auto last_it=list_view_text.get_model()->children().end();
last_it--;
if(last_it)
list_view_text.set_cursor(list_view_text.get_model()->get_path(last_it));
}
select(false);

32
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,7 +515,7 @@ bool Source::View::on_key_press_event(GdkEventKey* key) {
if((line_nr+1)<get_buffer()->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--;
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()) {
@ -527,6 +526,7 @@ bool Source::View::on_key_press_event(GdkEventKey* key) {
}
}
}
}
get_source_buffer()->insert_at_cursor("\n"+sm[1].str());
scroll_to(get_source_buffer()->get_insert());
get_source_buffer()->end_user_action();
@ -570,8 +570,7 @@ 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;c<indent_left_steps;c++)
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();
@ -590,9 +589,7 @@ 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;c<line.size();c++)
previous_line_end_it--;
previous_line_end_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,8 +598,7 @@ 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;c<tab_size;c++)
insert_minus_tab_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;c<sm[1].str().size()+2;c++)
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;c<sm[1].str().size()+1;c++)
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,9 +1166,7 @@ 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;c<tab_size;c++)
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("}");
@ -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;c<prefix.size();c++)
start_iter--;
if(prefix.size()>0 && !start_iter.backward_chars(prefix.size()))
return;
completion_dialog=std::unique_ptr<CompletionDialog>(new CompletionDialog(*this, get_buffer()->create_mark(start_iter)));
auto rows=std::make_shared<std::unordered_map<std::string, std::string> >();
completion_dialog->on_hide=[this](){

4
src/sourcefile.cc

@ -70,9 +70,7 @@ bool juci::filesystem::write(const std::string &path, Glib::RefPtr<Gtk::TextBuff
bool end_reached=false;
while(!end_reached) {
for(size_t c=0;c<buffer_size;c++) {
if(end_iter)
end_iter++;
else {
if(!end_iter.forward_char()) {
end_reached=true;
break;
}

9
src/terminal.cc

@ -280,7 +280,7 @@ void Terminal::kill_async_executes(bool force) {
}
int Terminal::print(const std::string &message, bool bold){
INFO("Terminal: PrintMessage");
DEBUG("start");
if(bold)
get_buffer()->insert_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::InProgress> Terminal::print_in_progress(std::string start_msg) {

23
src/tooltips.cc

@ -1,6 +1,9 @@
#include "tooltips.h"
#include "singletons.h"
#include <iostream>
using namespace std;
namespace sigc {
template <typename Functor>
struct functor_trait<Functor, false> {
@ -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()<end_iter.get_offset()) {
iter++;
while(iter!=end_iter) {
while(iter!=end_iter && iter.forward_char()) {
Gdk::Rectangle rectangle;
text_view.get_iter_location(iter, rectangle);
activation_rectangle.join(rectangle);
iter++;
}
}
int location_window_x, location_window_y;
@ -107,28 +108,28 @@ void Tooltip::wrap_lines(Glib::RefPtr<Gtk::TextBuffer> 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);
}
}
}

2
src/window.cc

@ -214,6 +214,7 @@ void Window::create_menu() {
if(notebook.get_current_page()!=-1) {
while(gtk_events_pending())
gtk_main_iteration();
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);
}
});
@ -226,6 +227,7 @@ 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();
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);
}
}

Loading…
Cancel
Save