|  | /*
 * Carla Native Plugins
 * Copyright (C) 2012-2015 Filipe Coelho <falktx@falktx.com>
 *
 * 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;
}
// --------------------------------------------------------------------------------------------
 |