|
|
@@ -1,6 +1,6 @@ |
|
|
/* |
|
|
/* |
|
|
* DISTRHO ProM Plugin |
|
|
* DISTRHO ProM Plugin |
|
|
* Copyright (C) 2015-2022 Filipe Coelho <falktx@falktx.com> |
|
|
|
|
|
|
|
|
* Copyright (C) 2015-2026 Filipe Coelho <falktx@falktx.com> |
|
|
* |
|
|
* |
|
|
* This program is free software; you can redistribute it and/or |
|
|
* This program is free software; you can redistribute it and/or |
|
|
* modify it under the terms of the GNU Lesser General Public |
|
|
* modify it under the terms of the GNU Lesser General Public |
|
|
@@ -33,16 +33,13 @@ START_NAMESPACE_DISTRHO |
|
|
// ----------------------------------------------------------------------- |
|
|
// ----------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
DistrhoUIProM::DistrhoUIProM() |
|
|
DistrhoUIProM::DistrhoUIProM() |
|
|
: UI(512, 512), |
|
|
|
|
|
|
|
|
: UI(), |
|
|
fPM(nullptr), |
|
|
fPM(nullptr), |
|
|
fResizeHandle(this) |
|
|
fResizeHandle(this) |
|
|
{ |
|
|
{ |
|
|
const double scaleFactor = getScaleFactor(); |
|
|
const double scaleFactor = getScaleFactor(); |
|
|
|
|
|
|
|
|
if (d_isNotZero(scaleFactor)) |
|
|
|
|
|
setSize(512*scaleFactor, 512*scaleFactor); |
|
|
|
|
|
|
|
|
|
|
|
setGeometryConstraints(256*scaleFactor, 256*scaleFactor, true); |
|
|
|
|
|
|
|
|
setGeometryConstraints(256 * scaleFactor, 256 * scaleFactor, true); |
|
|
|
|
|
|
|
|
// no need to show resize handle if window is user-resizable |
|
|
// no need to show resize handle if window is user-resizable |
|
|
// if (isResizable()) |
|
|
// if (isResizable()) |
|
|
@@ -88,43 +85,43 @@ void DistrhoUIProM::uiIdle() |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void DistrhoUIProM::uiReshape(const uint width, const uint height) |
|
|
|
|
|
{ |
|
|
|
|
|
UI::uiReshape(width, height); |
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------- |
|
|
|
|
|
// Widget Callbacks |
|
|
|
|
|
|
|
|
if (fPM == nullptr) |
|
|
|
|
|
|
|
|
void DistrhoUIProM::onDisplay() |
|
|
|
|
|
{ |
|
|
|
|
|
if (fResized) |
|
|
{ |
|
|
{ |
|
|
|
|
|
if (fPM == nullptr) |
|
|
|
|
|
{ |
|
|
#ifdef PROJECTM_DATA_DIR |
|
|
#ifdef PROJECTM_DATA_DIR |
|
|
fPM = new projectM(PROJECTM_DATA_DIR "/config.inp"); |
|
|
|
|
|
|
|
|
fPM = new projectM(PROJECTM_DATA_DIR "/config.inp"); |
|
|
#else |
|
|
#else |
|
|
if (const char* const bundlePath = getBundlePath()) |
|
|
|
|
|
{ |
|
|
|
|
|
const String datadir(getResourcePath(bundlePath)); |
|
|
|
|
|
d_stdout("ProM datadir: '%s'", datadir.buffer()); |
|
|
|
|
|
|
|
|
|
|
|
projectM::Settings settings; |
|
|
|
|
|
settings.presetURL = datadir + DISTRHO_OS_SEP_STR "presets"; |
|
|
|
|
|
settings.titleFontURL = datadir + DISTRHO_OS_SEP_STR "fonts" DISTRHO_OS_SEP_STR "Vera.ttf"; |
|
|
|
|
|
settings.menuFontURL = datadir + DISTRHO_OS_SEP_STR "fonts" DISTRHO_OS_SEP_STR "VeraMono.ttf"; |
|
|
|
|
|
settings.datadir = datadir; |
|
|
|
|
|
fPM = new projectM(settings); |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
d_stderr2("ProM: failed to find bundle path, UI will be empty"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (const char* const bundlePath = getBundlePath()) |
|
|
|
|
|
{ |
|
|
|
|
|
const String datadir(getResourcePath(bundlePath)); |
|
|
|
|
|
d_stdout("ProM datadir: '%s'", datadir.buffer()); |
|
|
|
|
|
|
|
|
|
|
|
projectM::Settings settings; |
|
|
|
|
|
settings.presetURL = datadir + DISTRHO_OS_SEP_STR "presets"; |
|
|
|
|
|
settings.titleFontURL = datadir + DISTRHO_OS_SEP_STR "fonts" DISTRHO_OS_SEP_STR "Vera.ttf"; |
|
|
|
|
|
settings.menuFontURL = datadir + DISTRHO_OS_SEP_STR "fonts" DISTRHO_OS_SEP_STR "VeraMono.ttf"; |
|
|
|
|
|
settings.datadir = datadir; |
|
|
|
|
|
fPM = new projectM(settings); |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
d_stderr2("ProM: failed to find bundle path, UI will be empty"); |
|
|
|
|
|
} |
|
|
#endif |
|
|
#endif |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (fPM != nullptr) |
|
|
|
|
|
fPM->projectM_resetGL(width, height); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (fPM != nullptr) |
|
|
|
|
|
fPM->projectM_resetGL(getWidth(), getHeight()); |
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------- |
|
|
|
|
|
// Widget Callbacks |
|
|
|
|
|
|
|
|
fResized = false; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
void DistrhoUIProM::onDisplay() |
|
|
|
|
|
{ |
|
|
|
|
|
if (fPM == nullptr) |
|
|
if (fPM == nullptr) |
|
|
return; |
|
|
return; |
|
|
|
|
|
|
|
|
@@ -138,12 +135,6 @@ static projectMKeycode dgl2pmkey(const DGL_NAMESPACE::Key key) noexcept |
|
|
{ |
|
|
{ |
|
|
switch (key) |
|
|
switch (key) |
|
|
{ |
|
|
{ |
|
|
case DGL_NAMESPACE::kKeyBackspace: |
|
|
|
|
|
return PROJECTM_K_BACKSPACE; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyEscape: |
|
|
|
|
|
return PROJECTM_K_ESCAPE; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyDelete: |
|
|
|
|
|
return PROJECTM_K_DELETE; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyF1: |
|
|
case DGL_NAMESPACE::kKeyF1: |
|
|
return PROJECTM_K_F1; |
|
|
return PROJECTM_K_F1; |
|
|
case DGL_NAMESPACE::kKeyF2: |
|
|
case DGL_NAMESPACE::kKeyF2: |
|
|
@@ -168,6 +159,14 @@ static projectMKeycode dgl2pmkey(const DGL_NAMESPACE::Key key) noexcept |
|
|
return PROJECTM_K_F11; |
|
|
return PROJECTM_K_F11; |
|
|
case DGL_NAMESPACE::kKeyF12: |
|
|
case DGL_NAMESPACE::kKeyF12: |
|
|
return PROJECTM_K_F12; |
|
|
return PROJECTM_K_F12; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPageUp: |
|
|
|
|
|
return PROJECTM_K_PAGEUP; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPageDown: |
|
|
|
|
|
return PROJECTM_K_PAGEDOWN; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyEnd: |
|
|
|
|
|
return PROJECTM_K_END; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyHome: |
|
|
|
|
|
return PROJECTM_K_HOME; |
|
|
case DGL_NAMESPACE::kKeyLeft: |
|
|
case DGL_NAMESPACE::kKeyLeft: |
|
|
return PROJECTM_K_LEFT; |
|
|
return PROJECTM_K_LEFT; |
|
|
case DGL_NAMESPACE::kKeyUp: |
|
|
case DGL_NAMESPACE::kKeyUp: |
|
|
@@ -176,14 +175,6 @@ static projectMKeycode dgl2pmkey(const DGL_NAMESPACE::Key key) noexcept |
|
|
return PROJECTM_K_RIGHT; |
|
|
return PROJECTM_K_RIGHT; |
|
|
case DGL_NAMESPACE::kKeyDown: |
|
|
case DGL_NAMESPACE::kKeyDown: |
|
|
return PROJECTM_K_DOWN; |
|
|
return PROJECTM_K_DOWN; |
|
|
case DGL_NAMESPACE::kKeyPageUp: |
|
|
|
|
|
return PROJECTM_K_PAGEUP; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPageDown: |
|
|
|
|
|
return PROJECTM_K_PAGEDOWN; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyHome: |
|
|
|
|
|
return PROJECTM_K_HOME; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyEnd: |
|
|
|
|
|
return PROJECTM_K_END; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyInsert: |
|
|
case DGL_NAMESPACE::kKeyInsert: |
|
|
return PROJECTM_K_INSERT; |
|
|
return PROJECTM_K_INSERT; |
|
|
case DGL_NAMESPACE::kKeyShiftL: |
|
|
case DGL_NAMESPACE::kKeyShiftL: |
|
|
@@ -192,17 +183,84 @@ static projectMKeycode dgl2pmkey(const DGL_NAMESPACE::Key key) noexcept |
|
|
return PROJECTM_K_RSHIFT; |
|
|
return PROJECTM_K_RSHIFT; |
|
|
case DGL_NAMESPACE::kKeyControlL: |
|
|
case DGL_NAMESPACE::kKeyControlL: |
|
|
return PROJECTM_K_LCTRL; |
|
|
return PROJECTM_K_LCTRL; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPad0: |
|
|
|
|
|
return PROJECTM_K_0; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPad1: |
|
|
|
|
|
return PROJECTM_K_1; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPad2: |
|
|
|
|
|
return PROJECTM_K_2; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPad3: |
|
|
|
|
|
return PROJECTM_K_3; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPad4: |
|
|
|
|
|
return PROJECTM_K_4; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPad5: |
|
|
|
|
|
return PROJECTM_K_5; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPad6: |
|
|
|
|
|
return PROJECTM_K_6; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPad7: |
|
|
|
|
|
return PROJECTM_K_7; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPad8: |
|
|
|
|
|
return PROJECTM_K_8; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPad9: |
|
|
|
|
|
return PROJECTM_K_9; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPadEnter: |
|
|
|
|
|
return PROJECTM_K_RETURN; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPadPageUp: |
|
|
|
|
|
return PROJECTM_K_PAGEUP; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPadPageDown: |
|
|
|
|
|
return PROJECTM_K_PAGEDOWN; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPadEnd: |
|
|
|
|
|
return PROJECTM_K_END; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPadHome: |
|
|
|
|
|
return PROJECTM_K_HOME; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPadLeft: |
|
|
|
|
|
return PROJECTM_K_LEFT; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPadUp: |
|
|
|
|
|
return PROJECTM_K_UP; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPadRight: |
|
|
|
|
|
return PROJECTM_K_RIGHT; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPadDown: |
|
|
|
|
|
return PROJECTM_K_DOWN; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPadInsert: |
|
|
|
|
|
return PROJECTM_K_INSERT; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPadDelete: |
|
|
|
|
|
return PROJECTM_K_DELETE; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPadEqual: |
|
|
|
|
|
return PROJECTM_K_EQUALS; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPadAdd: |
|
|
|
|
|
return PROJECTM_K_PLUS; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPadSubtract: |
|
|
|
|
|
return PROJECTM_K_MINUS; |
|
|
|
|
|
|
|
|
|
|
|
case DGL_NAMESPACE::kKeyBackspace: |
|
|
|
|
|
return PROJECTM_K_BACKSPACE; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyTab: |
|
|
|
|
|
// TODO |
|
|
|
|
|
case DGL_NAMESPACE::kKeyEnter: |
|
|
|
|
|
return PROJECTM_K_RETURN; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyEscape: |
|
|
|
|
|
return PROJECTM_K_ESCAPE; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyDelete: |
|
|
|
|
|
return PROJECTM_K_DELETE; |
|
|
|
|
|
case DGL_NAMESPACE::kKeySpace: |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
case DGL_NAMESPACE::kKeyPrintScreen: |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPause: |
|
|
|
|
|
case DGL_NAMESPACE::kKeyMenu: |
|
|
|
|
|
case DGL_NAMESPACE::kKeyNumLock: |
|
|
|
|
|
case DGL_NAMESPACE::kKeyScrollLock: |
|
|
|
|
|
case DGL_NAMESPACE::kKeyCapsLock: |
|
|
case DGL_NAMESPACE::kKeyControlR: |
|
|
case DGL_NAMESPACE::kKeyControlR: |
|
|
case DGL_NAMESPACE::kKeyAltL: |
|
|
case DGL_NAMESPACE::kKeyAltL: |
|
|
case DGL_NAMESPACE::kKeyAltR: |
|
|
case DGL_NAMESPACE::kKeyAltR: |
|
|
case DGL_NAMESPACE::kKeySuperL: |
|
|
case DGL_NAMESPACE::kKeySuperL: |
|
|
case DGL_NAMESPACE::kKeySuperR: |
|
|
case DGL_NAMESPACE::kKeySuperR: |
|
|
case DGL_NAMESPACE::kKeyMenu: |
|
|
|
|
|
case DGL_NAMESPACE::kKeyCapsLock: |
|
|
|
|
|
case DGL_NAMESPACE::kKeyScrollLock: |
|
|
|
|
|
case DGL_NAMESPACE::kKeyNumLock: |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPrintScreen: |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPause: |
|
|
|
|
|
|
|
|
case DGL_NAMESPACE::kKeyPadClear: |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPadMultiply: |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPadSeparator: |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPadDecimal: |
|
|
|
|
|
case DGL_NAMESPACE::kKeyPadDivide: |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@@ -251,20 +309,28 @@ bool DistrhoUIProM::onKeyboard(const KeyboardEvent& ev) |
|
|
else |
|
|
else |
|
|
{ |
|
|
{ |
|
|
/* missing: |
|
|
/* missing: |
|
|
* PROJECTM_K_CAPSLOCK |
|
|
|
|
|
|
|
|
* PROJECTM_K_TAB |
|
|
|
|
|
* PROJECTM_K_SPACE |
|
|
*/ |
|
|
*/ |
|
|
switch (ev.key) |
|
|
switch (ev.key) |
|
|
{ |
|
|
{ |
|
|
case DGL_NAMESPACE::kKeyBackspace: |
|
|
case DGL_NAMESPACE::kKeyBackspace: |
|
|
pmKey = PROJECTM_K_BACKSPACE; |
|
|
pmKey = PROJECTM_K_BACKSPACE; |
|
|
break; |
|
|
break; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyTab: |
|
|
|
|
|
break; |
|
|
|
|
|
case DGL_NAMESPACE::kKeyEnter: |
|
|
|
|
|
pmKey = PROJECTM_K_RETURN; |
|
|
|
|
|
break; |
|
|
case DGL_NAMESPACE::kKeyEscape: |
|
|
case DGL_NAMESPACE::kKeyEscape: |
|
|
pmKey = PROJECTM_K_ESCAPE; |
|
|
pmKey = PROJECTM_K_ESCAPE; |
|
|
break; |
|
|
break; |
|
|
case DGL_NAMESPACE::kKeyDelete: |
|
|
case DGL_NAMESPACE::kKeyDelete: |
|
|
pmKey = PROJECTM_K_DELETE; |
|
|
pmKey = PROJECTM_K_DELETE; |
|
|
break; |
|
|
break; |
|
|
case '\r': |
|
|
|
|
|
|
|
|
case DGL_NAMESPACE::kKeySpace: |
|
|
|
|
|
break; |
|
|
|
|
|
case '\n': |
|
|
pmKey = PROJECTM_K_RETURN; |
|
|
pmKey = PROJECTM_K_RETURN; |
|
|
break; |
|
|
break; |
|
|
#ifdef HAVE_PROJECTM_TEXT_FUNCTIONS |
|
|
#ifdef HAVE_PROJECTM_TEXT_FUNCTIONS |
|
|
@@ -305,6 +371,12 @@ bool DistrhoUIProM::onMouse(const MouseEvent& ev) |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void DistrhoUIProM::onResize(const ResizeEvent& ev) |
|
|
|
|
|
{ |
|
|
|
|
|
fResized = true; |
|
|
|
|
|
UI::onResize(ev); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------- |
|
|
// ----------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
UI* createUI() |
|
|
UI* createUI() |
|
|
|