From bcd8a1a4e362fcb1d3ec4dd69dd00e2b1157d4d1 Mon Sep 17 00:00:00 2001 From: eidheim Date: Tue, 22 Sep 2015 14:12:44 +0200 Subject: [PATCH] Fixes #60, default max terminal buffer size is now 1000. --- src/config.cc | 1 + src/files.h | 1 + src/terminal.cc | 20 ++++++++++++++--- src/terminal.h | 3 +++ src/terminal_win.cc | 52 ++++++++++++++++++++++++++++++++++----------- 5 files changed, 62 insertions(+), 15 deletions(-) diff --git a/src/config.cc b/src/config.cc index 6bc771e..324cd76 100644 --- a/src/config.cc +++ b/src/config.cc @@ -62,6 +62,7 @@ void MainConfig::retrieve_config() { Singleton::Config::window()->default_size = {cfg.get("default_window_size.width"), cfg.get("default_window_size.height")}; Singleton::Config::terminal()->make_command=cfg.get("project.make_command"); Singleton::Config::terminal()->cmake_command=cfg.get("project.cmake_command"); + Singleton::Config::terminal()->history_size=cfg.get("terminal_history_size"); } bool MainConfig::check_config_file(const boost::property_tree::ptree &default_cfg, std::string parent_path) { diff --git a/src/files.h b/src/files.h index 0602c7e..750f49c 100644 --- a/src/files.h +++ b/src/files.h @@ -9,6 +9,7 @@ const std::string configjson = " \"width\": 600,\n" " \"height\": 400\n" " },\n" +" \"terminal_history_size\": 1000,\n" " \"gtk_theme\": {\n" " \"name\": \"Adwaita\", //Use \"\" for default theme, At least these two exist on all systems: Adwaita, Raleigh\n" " \"variant\": \"\" //Use \"\" for default variant, and \"dark\" for dark theme variant\n" diff --git a/src/terminal.cc b/src/terminal.cc index eb96fcf..f703239 100644 --- a/src/terminal.cc +++ b/src/terminal.cc @@ -296,17 +296,26 @@ int Terminal::print(const std::string &message, bool bold){ else get_buffer()->insert(get_buffer()->end(), umessage); - auto end_iter=get_buffer()->end(); + /*auto end_iter=get_buffer()->end(); if(end_iter.backward_char()) { auto mark=get_buffer()->create_mark(end_iter); scroll_to(mark, 0.0, 1.0, 1.0); get_buffer()->delete_mark(mark); + }*/ + + if(get_buffer()->get_line_count()>Singleton::Config::terminal()->history_size) { + int lines=get_buffer()->get_line_count()-Singleton::Config::terminal()->history_size; + get_buffer()->erase(get_buffer()->begin(), get_buffer()->get_iter_at_line(lines)); + deleted_lines+=static_cast(lines); } - return get_buffer()->end().get_line(); + return static_cast(static_cast(get_buffer()->end().get_line())+deleted_lines); } void Terminal::print(int line_nr, const std::string &message){ + if(static_cast(line_nr)get_iter_at_line(line_nr); + auto end_line_iter=get_buffer()->get_iter_at_line(static_cast(static_cast(line_nr)-deleted_lines)); while(!end_line_iter.ends_line() && end_line_iter.forward_char()) {} get_buffer()->insert(end_line_iter, umessage); + + if(get_buffer()->get_line_count()>Singleton::Config::terminal()->history_size) { + int lines=get_buffer()->get_line_count()-Singleton::Config::terminal()->history_size; + get_buffer()->erase(get_buffer()->begin(), get_buffer()->get_iter_at_line(lines)); + } } std::shared_ptr Terminal::print_in_progress(std::string start_msg) { diff --git a/src/terminal.h b/src/terminal.h index 173a4de..3bdf068 100644 --- a/src/terminal.h +++ b/src/terminal.h @@ -15,6 +15,7 @@ public: public: std::string cmake_command; std::string make_command; + int history_size; }; class InProgress { @@ -60,6 +61,8 @@ private: std::list > async_executes; #endif std::string stdin_buffer; + + size_t deleted_lines=0; }; #endif // JUCI_TERMINAL_H_ diff --git a/src/terminal_win.cc b/src/terminal_win.cc index e79014d..9de10c6 100644 --- a/src/terminal_win.cc +++ b/src/terminal_win.cc @@ -332,30 +332,58 @@ void Terminal::kill_async_executes(bool force) { } int Terminal::print(const std::string &message, bool bold){ - INFO("Terminal: PrintMessage"); + Glib::ustring umessage=message; + Glib::ustring::iterator iter; + while(!umessage.validate(iter)) { + auto next_char_iter=iter; + next_char_iter++; + umessage.replace(iter, next_char_iter, "?"); + } + if(bold) - get_buffer()->insert_with_tag(get_buffer()->end(), message, bold_tag); + get_buffer()->insert_with_tag(get_buffer()->end(), umessage, bold_tag); else - get_buffer()->insert(get_buffer()->end(), message); + get_buffer()->insert(get_buffer()->end(), umessage); - auto iter=get_buffer()->end(); - if(iter.backward_char()) { - auto mark=get_buffer()->create_mark(iter); + /*auto end_iter=get_buffer()->end(); + if(end_iter.backward_char()) { + auto mark=get_buffer()->create_mark(end_iter); scroll_to(mark, 0.0, 1.0, 1.0); get_buffer()->delete_mark(mark); + }*/ + + if(get_buffer()->get_line_count()>Singleton::Config::terminal()->history_size) { + int lines=get_buffer()->get_line_count()-Singleton::Config::terminal()->history_size; + get_buffer()->erase(get_buffer()->begin(), get_buffer()->get_iter_at_line(lines)); + deleted_lines+=static_cast(lines); } - return get_buffer()->end().get_line(); + return static_cast(static_cast(get_buffer()->end().get_line())+deleted_lines); } void Terminal::print(int line_nr, const std::string &message){ - INFO("Terminal: PrintMessage at line " << line_nr); - auto iter=get_buffer()->get_iter_at_line(line_nr); - while(!iter.ends_line()) - iter++; - get_buffer()->insert(iter, message); + if(static_cast(line_nr)get_iter_at_line(static_cast(static_cast(line_nr)-deleted_lines)); + while(!end_line_iter.ends_line() && end_line_iter.forward_char()) {} + get_buffer()->insert(end_line_iter, umessage); + + if(get_buffer()->get_line_count()>Singleton::Config::terminal()->history_size) { + int lines=get_buffer()->get_line_count()-Singleton::Config::terminal()->history_size; + get_buffer()->erase(get_buffer()->begin(), get_buffer()->get_iter_at_line(lines)); + } } + std::shared_ptr Terminal::print_in_progress(std::string start_msg) { std::shared_ptr in_progress=std::shared_ptr(new Terminal::InProgress(start_msg)); return in_progress;