diff --git a/src/actions/actions-base.cpp b/src/actions/actions-base.cpp index 016287170e09027f4c6b944751c24bd529f19744..fe174546dd42389c1eb8452387a358602d1c0260 100644 --- a/src/actions/actions-base.cpp +++ b/src/actions/actions-base.cpp @@ -27,6 +27,37 @@ #include "file.h" // dpi convert method #include "io/resource.h" +// capture +#include +#include +#include +class CaptureStdout { + public: + CaptureStdout(std::string filename) { + auto it = std::remove_if(filename.begin(),filename.end(), + [](const char x) {return !std::isalpha(static_cast(x)) && !std::isdigit(static_cast(x));}); + filename.erase(it,filename.end()); + _filename.append(G_DIR_SEPARATOR_S); + _filename += filename; + _stdout = std::cout.rdbuf(); + std::cout.rdbuf(_out.rdbuf()); + } + ~CaptureStdout() { + std::ofstream outfile; + outfile.open(_filename, std::ios::in | std::ios::trunc); + outfile << _out.str(); + outfile.close(); + std::cout.rdbuf(_stdout); + std::cout << _out.str() << std::endl; + } + private: + std::streambuf *_stdout; + std::ostringstream _out; + std::string _filename = Glib::get_tmp_dir(); +}; + +CaptureStdout *capture = nullptr; + void print_inkscape_version() { @@ -133,6 +164,23 @@ query_all_recurse (SPObject *o) } } +void +uncapture_cout() +{ + if (capture) { + delete capture; + capture = nullptr; + } +} + +void +capture_cout(const Glib::VariantBase& value) +{ + uncapture_cout(); + Glib::Variant s = Glib::VariantBase::cast_dynamic >(value); + capture = new CaptureStdout(s.get()); +} + void query_all(InkscapeApplication* app) { @@ -192,6 +240,9 @@ std::vector> raw_data_base = {"app.debug-info", N_("Debug Info"), "Base", N_("Print debugging information and exit") }, {"app.system-data-directory", N_("System Directory"), "Base", N_("Print system data directory and exit") }, {"app.user-data-directory", N_("User Directory"), "Base", N_("Print user data directory and exit") }, + {"app.capture-cout", N_("Capture cout to file"), "Base", N_("Capture cout to file") }, + {"app.uncapture-cout", N_("Uncapture cout"), "Base", N_("Uncapture cout'") }, + {"app.action-list", N_("List Actions"), "Base", N_("Print a list of actions and exit") }, {"app.vacuum-defs", N_("Clean up Document"), "Base", N_("Remove unused definitions (gradients, etc.)") }, {"app.quit", N_("Quit"), "Base", N_("Quit Inkscape, check for data loss") }, @@ -213,6 +264,7 @@ void add_actions_base(InkscapeApplication* app) { auto *gapp = app->gio_app(); + Glib::VariantType String(Glib::VARIANT_TYPE_STRING); // Note: "radio" actions are just an easy way to set type without using templating. // clang-format off @@ -220,10 +272,13 @@ add_actions_base(InkscapeApplication* app) gapp->add_action( "debug-info", sigc::ptr_fun(&print_debug_info) ); gapp->add_action( "system-data-directory", sigc::ptr_fun(&print_system_data_directory) ); gapp->add_action( "user-data-directory", sigc::ptr_fun(&print_user_data_directory) ); + gapp->add_action_with_parameter("capture-cout", String, sigc::ptr_fun(&capture_cout) ); + gapp->add_action( "uncapture-cout", sigc::ptr_fun(&uncapture_cout) ); gapp->add_action( "action-list", sigc::mem_fun(*app, &InkscapeApplication::print_action_list) ); gapp->add_action( "vacuum-defs", sigc::bind(sigc::ptr_fun(&vacuum_defs), app) ); gapp->add_action( "quit", sigc::mem_fun(*app, &InkscapeApplication::on_quit) ); - gapp->add_action( "quit-immediate", sigc::mem_fun(*app, &InkscapeApplication::on_quit_immediate) ); + gapp->add_action( "quit-immediate", sigc::mem_fun(*app, &InkscapeApplication::on_quit_immediate) + ); gapp->add_action_radio_integer( "open-page", sigc::ptr_fun(&pdf_page), 0); gapp->add_action_radio_string( "convert-dpi-method", sigc::ptr_fun(&convert_dpi_method), "none");