Collection of DPF-based plugins for packaging
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

180 lines
5.2KB

  1. /*
  2. * DISTRHO Plugin Framework (DPF)
  3. * Copyright (C) 2012-2018 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * Permission to use, copy, modify, and/or distribute this software for any purpose with
  6. * or without fee is hereby granted, provided that the above copyright notice and this
  7. * permission notice appear in all copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
  10. * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
  11. * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  12. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
  13. * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  14. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. #include "DistrhoUIInternal.hpp"
  17. #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI
  18. # include "src/WidgetPrivateData.hpp"
  19. #endif
  20. START_NAMESPACE_DISTRHO
  21. /* ------------------------------------------------------------------------------------------------------------
  22. * Static data, see DistrhoUIInternal.hpp */
  23. double d_lastUiSampleRate = 0.0;
  24. void* d_lastUiDspPtr = nullptr;
  25. #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI
  26. uintptr_t g_nextWindowId = 0;
  27. const char* g_nextBundlePath = nullptr;
  28. #else
  29. Window* d_lastUiWindow = nullptr;
  30. #endif
  31. /* ------------------------------------------------------------------------------------------------------------
  32. * UI */
  33. #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI
  34. UI::UI(uint width, uint height, bool userResizable)
  35. : UIWidget(width, height),
  36. pData(new PrivateData(userResizable)) {}
  37. #else
  38. UI::UI(uint width, uint height, bool userResizable)
  39. : UIWidget(*d_lastUiWindow),
  40. pData(new PrivateData(userResizable))
  41. {
  42. ((UIWidget*)this)->pData->needsFullViewport = false;
  43. if (width > 0 && height > 0)
  44. setSize(width, height);
  45. }
  46. #endif
  47. UI::~UI()
  48. {
  49. delete pData;
  50. }
  51. bool UI::isUserResizable() const noexcept
  52. {
  53. return pData->userResizable;
  54. }
  55. #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI
  56. void UI::setGeometryConstraints(uint minWidth, uint minHeight, bool keepAspectRatio, bool automaticallyScale)
  57. {
  58. DISTRHO_SAFE_ASSERT_RETURN(minWidth > 0,);
  59. DISTRHO_SAFE_ASSERT_RETURN(minHeight > 0,);
  60. pData->automaticallyScale = automaticallyScale;
  61. pData->minWidth = minWidth;
  62. pData->minHeight = minHeight;
  63. getParentWindow().setGeometryConstraints(minWidth, minHeight, keepAspectRatio);
  64. }
  65. #endif
  66. /* ------------------------------------------------------------------------------------------------------------
  67. * Host state */
  68. double UI::getSampleRate() const noexcept
  69. {
  70. return pData->sampleRate;
  71. }
  72. void UI::editParameter(uint32_t index, bool started)
  73. {
  74. pData->editParamCallback(index + pData->parameterOffset, started);
  75. }
  76. void UI::setParameterValue(uint32_t index, float value)
  77. {
  78. pData->setParamCallback(index + pData->parameterOffset, value);
  79. }
  80. #if DISTRHO_PLUGIN_WANT_STATE
  81. void UI::setState(const char* key, const char* value)
  82. {
  83. pData->setStateCallback(key, value);
  84. }
  85. #endif
  86. #if DISTRHO_PLUGIN_WANT_MIDI_INPUT
  87. void UI::sendNote(uint8_t channel, uint8_t note, uint8_t velocity)
  88. {
  89. pData->sendNoteCallback(channel, note, velocity);
  90. }
  91. #endif
  92. #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS
  93. /* ------------------------------------------------------------------------------------------------------------
  94. * Direct DSP access */
  95. void* UI::getPluginInstancePointer() const noexcept
  96. {
  97. return pData->dspPtr;
  98. }
  99. #endif
  100. #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI
  101. /* ------------------------------------------------------------------------------------------------------------
  102. * External UI helpers */
  103. const char* UI::getNextBundlePath() noexcept
  104. {
  105. return g_nextBundlePath;
  106. }
  107. # if DISTRHO_PLUGIN_HAS_EMBED_UI
  108. uintptr_t UI::getNextWindowId() noexcept
  109. {
  110. return g_nextWindowId;
  111. }
  112. # endif
  113. #endif
  114. /* ------------------------------------------------------------------------------------------------------------
  115. * DSP/Plugin Callbacks (optional) */
  116. void UI::sampleRateChanged(double) {}
  117. #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI
  118. /* ------------------------------------------------------------------------------------------------------------
  119. * UI Callbacks (optional) */
  120. # ifndef DGL_FILE_BROWSER_DISABLED
  121. void UI::uiFileBrowserSelected(const char*)
  122. {
  123. }
  124. # endif
  125. void UI::uiReshape(uint width, uint height)
  126. {
  127. glEnable(GL_BLEND);
  128. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  129. glMatrixMode(GL_PROJECTION);
  130. glLoadIdentity();
  131. glOrtho(0.0, static_cast<GLdouble>(width), static_cast<GLdouble>(height), 0.0, 0.0, 1.0);
  132. glViewport(0, 0, static_cast<GLsizei>(width), static_cast<GLsizei>(height));
  133. glMatrixMode(GL_MODELVIEW);
  134. glLoadIdentity();
  135. }
  136. /* ------------------------------------------------------------------------------------------------------------
  137. * UI Resize Handling, internal */
  138. void UI::onResize(const ResizeEvent& ev)
  139. {
  140. if (pData->resizeInProgress)
  141. return;
  142. pData->setSizeCallback(ev.size.getWidth(), ev.size.getHeight());
  143. }
  144. #endif // !DISTRHO_PLUGIN_HAS_EXTERNAL_UI
  145. // -----------------------------------------------------------------------------------------------------------
  146. END_NAMESPACE_DISTRHO