diff options
author | Robin Gareus <robin@gareus.org> | 2016-12-11 15:45:42 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2016-12-11 15:52:56 +0100 |
commit | 2481db7a7f77b7c2020f044aa685c6822c500dda (patch) | |
tree | b2600b2d006d5ad4b2ca50f7ae733292f1be5013 /gtk2_ardour/canvas_test.cc | |
parent | 165645495c9d8dac1ed490c8b1f7a793bcd8d8fd (diff) |
Add a small tool to experiment with libcanvas
Diffstat (limited to 'gtk2_ardour/canvas_test.cc')
-rw-r--r-- | gtk2_ardour/canvas_test.cc | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/gtk2_ardour/canvas_test.cc b/gtk2_ardour/canvas_test.cc new file mode 100644 index 0000000000..9ccc242813 --- /dev/null +++ b/gtk2_ardour/canvas_test.cc @@ -0,0 +1,239 @@ +#include <glibmm.h> +#include <gtkmm/main.h> +#include <gtkmm/box.h> +#include <gtkmm/window.h> + +#include "pbd/debug.h" +#include "pbd/error.h" +#include "pbd/failed_constructor.h" +#include "pbd/pthread_utils.h" +#include "pbd/receiver.h" +#include "pbd/transmitter.h" + +#include "ardour/audioengine.h" +#include "ardour/filename_extensions.h" +#include "ardour/types.h" + +#include "gtkmm2ext/application.h" +#include "gtkmm2ext/window_title.h" +#include "gtkmm2ext/gtk_ui.h" +#include "gtkmm2ext/utils.h" + +#include "canvas/types.h" +#include "canvas/canvas.h" +#include "canvas/container.h" +#include "canvas/colors.h" +#include "canvas/scroll_group.h" +#include "canvas/text.h" + +#include "ardour_button.h" +#include "ui_config.h" + +#include "pbd/i18n.h" + +using namespace std; +using namespace ARDOUR; +using namespace PBD; +using namespace Gtkmm2ext; +using namespace Gtk; + +#include "ardour/vst_types.h" + +static const char* localedir = LOCALEDIR; +int vstfx_init (void*) { return 0; } +void vstfx_exit () {} +void vstfx_destroy_editor (VSTState*) {} + +class LogReceiver : public Receiver +{ + protected: + void receive (Transmitter::Channel chn, const char * str); +}; + +static LogReceiver log_receiver; + +void +LogReceiver::receive (Transmitter::Channel chn, const char * str) +{ + const char *prefix = ""; + + switch (chn) { + case Transmitter::Error: + prefix = "[ERROR]: "; + break; + case Transmitter::Info: + prefix = "[INFO]: "; + break; + case Transmitter::Warning: + prefix = "[WARNING]: "; + break; + case Transmitter::Fatal: + prefix = "[FATAL]: "; + break; + case Transmitter::Throw: + /* this isn't supposed to happen */ + cerr << "Game Over\n"; + abort (); + } + + /* note: iostreams are already thread-safe: no external + lock required. + */ + + std::cout << prefix << str << std::endl; + + if (chn == Transmitter::Fatal) { + ::exit (9); + } +} + +/* ***************************************************************************/ +/* ***************************************************************************/ +/* ***************************************************************************/ + +class CANVAS_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr +{ +public: + CANVAS_UI (int *argcp, char **argvp[], const char* localedir); + ~CANVAS_UI(); +private: + int starting (); + bool main_window_delete_event (GdkEventAny* ev) { finish (); return true; } + void finish () { quit (); } + Gtk::Window _main_window; + + ArdourCanvas::Container* initialize_canvas (ArdourCanvas::Canvas& canvas); + + void canvas_size_request (Gtk::Requisition* req); + void canvas_size_allocated (Gtk::Allocation& alloc); + + ArdourCanvas::GtkCanvas* canvas; + ArdourCanvas::Container* group; + + ArdourButton test_button; +}; + +/* ***************************************************************************/ + +CANVAS_UI::CANVAS_UI (int *argcp, char **argvp[], const char* localedir) + : Gtkmm2ext::UI (PROGRAM_NAME, X_("gui"), argcp, argvp) +{ + Gtkmm2ext::init (localedir); + UIConfiguration::instance().post_gui_init (); + + Gtkmm2ext::WindowTitle title ("Canvas Test"); + _main_window.set_title (title.get_string()); + _main_window.set_flags (CAN_FOCUS); + _main_window.signal_delete_event().connect (sigc::mem_fun (*this, &CANVAS_UI::main_window_delete_event)); + + + VBox* b = manage (new VBox); + Label* l = manage (new Label ("Hello there")); + + canvas = new ArdourCanvas::GtkCanvas (); + group = initialize_canvas (*canvas); + + canvas->signal_size_request().connect (sigc::mem_fun (*this, &CANVAS_UI::canvas_size_request)); + canvas->signal_size_allocate().connect (sigc::mem_fun (*this, &CANVAS_UI::canvas_size_allocated)); + test_button.signal_clicked.connect (sigc::mem_fun (*this, &CANVAS_UI::finish)); + + test_button.set_text ("Don't click me"); + + b->pack_start (*l, false, 0); + b->pack_start (test_button, false, 0); + b->pack_start (*canvas, true, 0); + + _main_window.add (*b); + _main_window.show_all (); +} + +CANVAS_UI::~CANVAS_UI () +{ +} + +int +CANVAS_UI::starting () +{ + Application* app = Application::instance (); + app->ready (); + return 0; +} + +ArdourCanvas::Container* +CANVAS_UI::initialize_canvas (ArdourCanvas::Canvas& canvas) +{ + using namespace ArdourCanvas; + canvas.set_background_color (rgba_to_color (0.0, 0.0, 1.0, 1.0)); + + ScrollGroup* scroll_group = new ScrollGroup (canvas.root(), + ScrollGroup::ScrollSensitivity (ScrollGroup::ScrollsVertically|ScrollGroup::ScrollsHorizontally)); + + Text* text = new Text (scroll_group); + text->set ("Canvas Text"); + + return new ArdourCanvas::Container (scroll_group); +} + +void +CANVAS_UI::canvas_size_request (Gtk::Requisition* req) +{ + req->width = 100; + req->height = 100; +} + +void +CANVAS_UI::canvas_size_allocated (Gtk::Allocation& alloc) +{ +} + +/* ***************************************************************************/ +/* ***************************************************************************/ +/* ***************************************************************************/ + +static CANVAS_UI *ui = 0; + +int main (int argc, char **argv) +{ +#if 0 + fixup_bundle_environment (argc, argv, localedir); + load_custom_fonts(); + // TODO setlocale.. +#endif + + if (!ARDOUR::init (false, true, localedir)) { + cerr << "Ardour failed to initialize\n" << endl; + ::exit (EXIT_FAILURE); + } + + if (!Glib::thread_supported()) { + Glib::thread_init(); + } + + pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, 0); + + log_receiver.listen_to (error); + log_receiver.listen_to (info); + log_receiver.listen_to (fatal); + log_receiver.listen_to (warning); + + if (UIConfiguration::instance().pre_gui_init ()) { + error << _("Could not complete pre-GUI initialization") << endmsg; + exit (1); + } + + // we could load a session here, if needed + // see ../session_utils/common.cc + + ui = new CANVAS_UI (&argc, &argv, localedir); + ui->run (log_receiver); + + info << "Farewell" << endmsg; + + Gtkmm2ext::Application::instance()->cleanup(); + delete ui; + ui = 0; + + ARDOUR::cleanup (); + pthread_cancel_all (); + return 0; +} |