/* * Carla Native Plugins * Copyright (C) 2012-2015 Filipe Coelho * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * For a full copy of the GNU General Public License see the doc/GPL.txt file. */ #include "CarlaPipeUtils.cpp" #include "zita-bls1/png2img.cc" #include "zita-bls1/guiclass.cc" #include "zita-bls1/mainwin.cc" #include "zita-bls1/rotary.cc" #include "zita-bls1/styles.cc" using namespace BLS1; static Mainwin* mainwin = nullptr; // -------------------------------------------------------------------------------------------- class ZitaPipeClient : public CarlaPipeClient, public Mainwin::ValueChangedCallback { public: ZitaPipeClient() noexcept : CarlaPipeClient(), fQuitReceived(false) {} ~ZitaPipeClient() noexcept override { if (fQuitReceived || ! isPipeRunning()) return; const CarlaMutexLocker cml(getPipeLock()); writeMessage("exiting\n"); flushMessages(); } bool quitRequested() const noexcept { return fQuitReceived; } protected: bool msgReceived(const char* const msg) noexcept override { if (std::strcmp(msg, "control") == 0) { uint index; float value; CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(index), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsFloat(value), true); mainwin->_rotary[index]->set_value(value); return true; } if (std::strcmp(msg, "show") == 0) { mainwin->x_map(); return true; } if (std::strcmp(msg, "hide") == 0) { mainwin->x_unmap(); return true; } if (std::strcmp(msg, "focus") == 0) { mainwin->x_mapraised(); return true; } if (std::strcmp(msg, "uiTitle") == 0) { const char* uiTitle; CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(uiTitle), true); mainwin->x_set_title(uiTitle); return true; } if (std::strcmp(msg, "quit") == 0) { fQuitReceived = true; mainwin->stop(); return true; } carla_stderr("ZitaPipeClient::msgReceived : %s", msg); return false; } void valueChangedCallback(uint index, double value) override { if (isPipeRunning()) writeControlMessage(index, value); } private: bool fQuitReceived; }; // -------------------------------------------------------------------------------------------- int main(int argc, const char* argv[]) { X_resman xresman; X_display *display; X_handler *handler; X_rootwin *rootwin; int ev, xp, yp, xs, ys; int fake_argc = 1; char* fake_argv[] = { (char*)"rev1" }; xresman.init(&fake_argc, fake_argv, (char*)"rev1", nullptr, 0); display = new X_display(nullptr); if (display->dpy () == 0) { carla_stderr("Can't open display."); delete display; return 1; } ZitaPipeClient pipe; const char* uiTitle = "Test UI"; if (argc > 1) { uiTitle = argv[2]; if (! pipe.initPipeClient(argv)) return 1; } xp = yp = 100; xs = Mainwin::XSIZE + 4; ys = Mainwin::YSIZE + 30; xresman.geometry(".geometry", display->xsize(), display->ysize(), 1, xp, yp, xs, ys); styles_init(display, &xresman); rootwin = new X_rootwin(display); mainwin = new Mainwin(rootwin, &xresman, xp, yp, &pipe); mainwin->x_set_title(uiTitle); rootwin->handle_event(); handler = new X_handler(display, mainwin, EV_X11); handler->next_event(); XFlush(display->dpy()); if (argc == 1) mainwin->x_map(); do { ev = mainwin->process(); if (ev == EV_X11) { rootwin->handle_event(); handler->next_event(); } else if (ev == Esync::EV_TIME) { handler->next_event(); if (pipe.isPipeRunning()) pipe.idlePipe(); } } while (ev != EV_EXIT && ! pipe.quitRequested()); styles_fini(display); delete handler; delete rootwin; delete display; return 0; } // --------------------------------------------------------------------------------------------