From 0274aafdb08238548dd4c20c52cd5375217f4e00 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 29 Jun 2015 16:27:03 -0400 Subject: [PATCH] store all error/info/etc messages in a list inside Gtkmm2ext::UI, and provide a method to dump them all to a std::ostream --- libs/gtkmm2ext/gtk_ui.cc | 32 +++++++++++++++++++++++++++++++ libs/gtkmm2ext/gtkmm2ext/gtk_ui.h | 6 +++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/libs/gtkmm2ext/gtk_ui.cc b/libs/gtkmm2ext/gtk_ui.cc index b5319fbea7..c4df2b7d5c 100644 --- a/libs/gtkmm2ext/gtk_ui.cc +++ b/libs/gtkmm2ext/gtk_ui.cc @@ -481,9 +481,41 @@ UI::do_request (UIRequest* req) Error Display ======================================================================*/ +void +UI::dump_errors (std::ostream& ostr) +{ + Glib::Threads::Mutex::Lock lm (error_lock); + ostr << endl << X_("Errors/Messages:") << endl; + for (list::const_iterator i = error_stack.begin(); i != error_stack.end(); ++i) { + ostr << *i << endl; + } + ostr << endl; +} + void UI::receive (Transmitter::Channel chn, const char *str) { + { + Glib::Threads::Mutex::Lock lm (error_lock); + switch (chn) { + case Transmitter::Fatal: + error_stack.push_back (string (X_("FATAL: ")) + str); + break; + case Transmitter::Error: + error_stack.push_back (string (X_("ERROR: ")) + str); + break; + case Transmitter::Warning: + error_stack.push_back (string (X_("WARNING: ")) + str); + break; + case Transmitter::Info: + error_stack.push_back (string (X_("INFO: ")) + str); + break; + case Transmitter::Throw: + error_stack.push_back (string (X_("THROW: ")) + str); + break; + } + } + if (caller_is_ui_thread()) { process_error_message (chn, str); } else { diff --git a/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h b/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h index 0a66accaef..177adb00ff 100644 --- a/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h +++ b/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h @@ -138,6 +138,7 @@ class LIBGTKMM2EXT_API UI : public AbstractUI void flush_pending (); void toggle_errors (); void show_errors (); + void dump_errors (std::ostream&); void touch_display (Touchable *); void set_tip (Gtk::Widget &w, const gchar *tip); void set_tip (Gtk::Widget &w, const std::string &tip); @@ -166,7 +167,7 @@ class LIBGTKMM2EXT_API UI : public AbstractUI sigc::signal theme_changed; static bool just_hide_it (GdkEventAny *, Gtk::Window *); - + protected: virtual void handle_fatal (const char *); virtual void display_message (const char *prefix, gint prefix_len, @@ -195,6 +196,9 @@ class LIBGTKMM2EXT_API UI : public AbstractUI void process_error_message (Transmitter::Channel, const char *); void do_quit (); + Glib::Threads::Mutex error_lock; + std::list error_stack; + void color_selection_done (bool status); bool color_selection_deleted (GdkEventAny *); bool color_picked;