| @@ -264,6 +264,12 @@ struct Window::PrivateData { | |||
| fView = nullptr; | |||
| } | |||
| if (fTitle != nullptr) | |||
| { | |||
| std::free(fTitle); | |||
| fTitle = nullptr; | |||
| } | |||
| #if defined(DISTRHO_OS_WINDOWS) | |||
| hwnd = 0; | |||
| #elif defined(DISTRHO_OS_MAC) | |||
| @@ -677,12 +683,15 @@ struct Window::PrivateData { | |||
| fSelf->onDisplayAfter(); | |||
| } | |||
| void onPuglKeyboard(const bool press, const uint key) | |||
| int onPuglKeyboard(const bool press, const uint key) | |||
| { | |||
| DBGp("PUGL: onKeyboard : %i %i\n", press, key); | |||
| if (fModal.childFocus != nullptr) | |||
| return fModal.childFocus->focus(); | |||
| { | |||
| fModal.childFocus->focus(); | |||
| return 0; | |||
| } | |||
| Widget::KeyboardEvent ev; | |||
| ev.press = press; | |||
| @@ -695,16 +704,21 @@ struct Window::PrivateData { | |||
| Widget* const widget(*rit); | |||
| if (widget->isVisible() && widget->onKeyboard(ev)) | |||
| break; | |||
| return 0; | |||
| } | |||
| return 1; | |||
| } | |||
| void onPuglSpecial(const bool press, const Key key) | |||
| int onPuglSpecial(const bool press, const Key key) | |||
| { | |||
| DBGp("PUGL: onSpecial : %i %i\n", press, key); | |||
| if (fModal.childFocus != nullptr) | |||
| return fModal.childFocus->focus(); | |||
| { | |||
| fModal.childFocus->focus(); | |||
| return 0; | |||
| } | |||
| Widget::SpecialEvent ev; | |||
| ev.press = press; | |||
| @@ -717,8 +731,10 @@ struct Window::PrivateData { | |||
| Widget* const widget(*rit); | |||
| if (widget->isVisible() && widget->onSpecial(ev)) | |||
| break; | |||
| return 0; | |||
| } | |||
| return 1; | |||
| } | |||
| void onPuglMouse(const int button, const bool press, const int x, const int y) | |||
| @@ -889,14 +905,14 @@ struct Window::PrivateData { | |||
| handlePtr->onPuglDisplay(); | |||
| } | |||
| static void onKeyboardCallback(PuglView* view, bool press, uint32_t key) | |||
| static int onKeyboardCallback(PuglView* view, bool press, uint32_t key) | |||
| { | |||
| handlePtr->onPuglKeyboard(press, key); | |||
| return handlePtr->onPuglKeyboard(press, key); | |||
| } | |||
| static void onSpecialCallback(PuglView* view, bool press, PuglKey key) | |||
| static int onSpecialCallback(PuglView* view, bool press, PuglKey key) | |||
| { | |||
| handlePtr->onPuglSpecial(press, static_cast<Key>(key)); | |||
| return handlePtr->onPuglSpecial(press, static_cast<Key>(key)); | |||
| } | |||
| static void onMouseCallback(PuglView* view, int button, bool press, int x, int y) | |||
| @@ -2280,13 +2280,13 @@ static void stbi__init_zdefaults(void) | |||
| static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) | |||
| { | |||
| int final, type; | |||
| int final_, type; | |||
| if (parse_header) | |||
| if (!stbi__parse_zlib_header(a)) return 0; | |||
| a->num_bits = 0; | |||
| a->code_buffer = 0; | |||
| do { | |||
| final = stbi__zreceive(a,1); | |||
| final_ = stbi__zreceive(a,1); | |||
| type = stbi__zreceive(a,2); | |||
| if (type == 0) { | |||
| if (!stbi__parse_uncomperssed_block(a)) return 0; | |||
| @@ -2303,7 +2303,7 @@ static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) | |||
| } | |||
| if (!stbi__parse_huffman_block(a)) return 0; | |||
| } | |||
| } while (!final); | |||
| } while (!final_); | |||
| return 1; | |||
| } | |||
| @@ -2535,13 +2535,13 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r | |||
| static int stbi__create_png_image(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, int interlaced) | |||
| { | |||
| stbi_uc *final; | |||
| stbi_uc *final_; | |||
| int p; | |||
| if (!interlaced) | |||
| return stbi__create_png_image_raw(a, raw, raw_len, out_n, a->s->img_x, a->s->img_y); | |||
| // de-interlacing | |||
| final = (stbi_uc *) malloc(a->s->img_x * a->s->img_y * out_n); | |||
| final_ = (stbi_uc *) malloc(a->s->img_x * a->s->img_y * out_n); | |||
| for (p=0; p < 7; ++p) { | |||
| int xorig[] = { 0,4,0,2,0,1,0 }; | |||
| int yorig[] = { 0,0,4,0,2,0,1 }; | |||
| @@ -2553,19 +2553,19 @@ static int stbi__create_png_image(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_l | |||
| y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; | |||
| if (x && y) { | |||
| if (!stbi__create_png_image_raw(a, raw, raw_len, out_n, x, y)) { | |||
| free(final); | |||
| free(final_); | |||
| return 0; | |||
| } | |||
| for (j=0; j < y; ++j) | |||
| for (i=0; i < x; ++i) | |||
| memcpy(final + (j*yspc[p]+yorig[p])*a->s->img_x*out_n + (i*xspc[p]+xorig[p])*out_n, | |||
| memcpy(final_ + (j*yspc[p]+yorig[p])*a->s->img_x*out_n + (i*xspc[p]+xorig[p])*out_n, | |||
| a->out + (j*x+i)*out_n, out_n); | |||
| free(a->out); | |||
| raw += (x*out_n+1)*y; | |||
| raw_len -= (x*out_n+1)*y; | |||
| } | |||
| } | |||
| a->out = final; | |||
| a->out = final_; | |||
| return 1; | |||
| } | |||
| @@ -74,8 +74,9 @@ typedef void (*PuglDisplayFunc)(PuglView* view); | |||
| @param view The view the event occured in. | |||
| @param press True if the key was pressed, false if released. | |||
| @param key Unicode point of the key pressed. | |||
| @return 0 if event was handled, otherwise send event to parent window. | |||
| */ | |||
| typedef void (*PuglKeyboardFunc)(PuglView* view, bool press, uint32_t key); | |||
| typedef int (*PuglKeyboardFunc)(PuglView* view, bool press, uint32_t key); | |||
| /** | |||
| A function called when the pointer moves. | |||
| @@ -129,8 +130,9 @@ typedef void (*PuglScrollFunc)(PuglView* view, int x, int y, float dx, float dy) | |||
| @param view The view the event occured in. | |||
| @param press True if the key was pressed, false if released. | |||
| @param key The key pressed. | |||
| @return 0 if event was handled, otherwise send event to parent window. | |||
| */ | |||
| typedef void (*PuglSpecialFunc)(PuglView* view, bool press, PuglKey key); | |||
| typedef int (*PuglSpecialFunc)(PuglView* view, bool press, PuglKey key); | |||
| /** | |||
| A function called when a filename is selected via file-browser. | |||
| @@ -430,6 +430,7 @@ dispatchKey(PuglView* view, XEvent* event, bool press) | |||
| { | |||
| KeySym sym; | |||
| char str[5]; | |||
| PuglKey special; | |||
| const int n = XLookupString(&event->xkey, str, 4, &sym, NULL); | |||
| if (sym == XK_Escape && view->closeFunc && !press && !view->parent) { | |||
| @@ -438,18 +439,30 @@ dispatchKey(PuglView* view, XEvent* event, bool press) | |||
| return; | |||
| } | |||
| if (n == 0) { | |||
| goto send_event; | |||
| return; | |||
| } | |||
| if (n > 1) { | |||
| fprintf(stderr, "warning: Unsupported multi-byte key %X\n", (int)sym); | |||
| goto send_event; | |||
| return; | |||
| } | |||
| const PuglKey special = keySymToSpecial(sym); | |||
| special = keySymToSpecial(sym); | |||
| if (special && view->specialFunc) { | |||
| view->specialFunc(view, press, special); | |||
| if (view->specialFunc(view, press, special) == 0) { | |||
| return; | |||
| } | |||
| } else if (!special && view->keyboardFunc) { | |||
| view->keyboardFunc(view, press, str[0]); | |||
| if (view->keyboardFunc(view, press, str[0]) == 0) { | |||
| return; | |||
| } | |||
| } | |||
| send_event: | |||
| if (view->parent) { | |||
| event->xany.window = view->parent; | |||
| XSendEvent(view->impl->display, view->parent, True, press ? KeyPressMask : KeyReleaseMask, event); | |||
| } | |||
| } | |||
| @@ -184,13 +184,20 @@ public: | |||
| ~PluginJack() | |||
| { | |||
| if (fClient == nullptr) | |||
| return; | |||
| if (fClient != nullptr) | |||
| jack_deactivate(fClient); | |||
| jack_deactivate(fClient); | |||
| if (fLastOutputValues != nullptr) | |||
| { | |||
| delete[] fLastOutputValues; | |||
| fLastOutputValues = nullptr; | |||
| } | |||
| fPlugin.deactivate(); | |||
| if (fClient == nullptr) | |||
| return; | |||
| #if DISTRHO_PLUGIN_IS_SYNTH | |||
| jack_port_unregister(fClient, fPortMidiIn); | |||
| fPortMidiIn = nullptr; | |||
| @@ -2,7 +2,7 @@ | |||
| set -e | |||
| PLUGINS=("Mini-Series" "MVerb" "Nekobi" "ProM" "ndc-Plugs") | |||
| PLUGINS=("Kars" "Mini-Series" "MVerb" "Nekobi" "ProM" "ndc-Plugs") | |||
| if [ ! -f Makefile ]; then | |||
| echo "Makefile not found, please run this script from DPF-Plugins root source dir" | |||
| @@ -163,7 +163,7 @@ void DistrhoPluginNekobi::initParameter(uint32_t index, Parameter& parameter) | |||
| switch (index) | |||
| { | |||
| case paramWaveform: | |||
| parameter.hints = kParameterIsAutomable|kParameterIsBoolean; | |||
| parameter.hints = kParameterIsAutomable|kParameterIsInteger; | |||
| parameter.name = "Waveform"; | |||
| parameter.symbol = "waveform"; | |||
| parameter.ranges.def = 0.0f; | |||
| @@ -20,10 +20,7 @@ | |||
| #include "DistrhoUI.hpp" | |||
| #include "ImageAboutWindow.hpp" | |||
| #include "ImageButton.hpp" | |||
| #include "ImageKnob.hpp" | |||
| #include "ImageSlider.hpp" | |||
| #include "ImageWidgets.hpp" | |||
| #include "DistrhoArtworkNekobi.hpp" | |||
| #include "NekoWidget.hpp" | |||