@@ -5,6 +5,7 @@ set -e | |||
sudo apt-get install -y \ | |||
g++ \ | |||
pkg-config \ | |||
libcairo2-dev \ | |||
libjack-jackd2-dev \ | |||
liblo-dev \ | |||
libgl1-mesa-dev \ | |||
@@ -7,8 +7,14 @@ _FLAGS="-Werror" | |||
export CFLAGS="${_FLAGS}" | |||
export CXXFLAGS="${_FLAGS}" | |||
# Start clean | |||
echo "==============> Normal build" | |||
make clean >/dev/null | |||
# Build now | |||
make | |||
echo "==============> No namespace build" | |||
make clean >/dev/null | |||
make CXXFLAGS="${_FLAGS} -DDONT_SET_USING_DISTRHO_NAMESPACE -DDONT_SET_USING_DGL_NAMESPACE" | |||
echo "==============> Custom namespace build" | |||
make clean >/dev/null | |||
make CXXFLAGS="${_FLAGS} -DDISTRHO_NAMESPACE=WubbWubb -DDGL_NAMESPACE=DabDab" |
@@ -17,4 +17,4 @@ export CROSS_COMPILING=true | |||
make clean >/dev/null | |||
# Build now | |||
make | |||
make HAVE_CAIRO=false HAVE_JACK=false |
@@ -17,4 +17,4 @@ export CROSS_COMPILING=true | |||
make clean >/dev/null | |||
# Build now | |||
make | |||
make HAVE_CAIRO=false HAVE_JACK=false |
@@ -11,6 +11,8 @@ CXX ?= g++ | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
# Auto-detect OS if not defined | |||
TARGET_MACHINE := $(shell $(CC) -dumpmachine) | |||
ifneq ($(BSD),true) | |||
ifneq ($(HAIKU),true) | |||
ifneq ($(HURD),true) | |||
@@ -18,7 +20,6 @@ ifneq ($(LINUX),true) | |||
ifneq ($(MACOS),true) | |||
ifneq ($(WINDOWS),true) | |||
TARGET_MACHINE := $(shell $(CC) -dumpmachine) | |||
ifneq (,$(findstring bsd,$(TARGET_MACHINE))) | |||
BSD=true | |||
endif | |||
@@ -45,6 +46,28 @@ endif | |||
endif | |||
endif | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
# Auto-detect the processor | |||
TARGET_PROCESSOR := $(firstword $(subst -, ,$(TARGET_MACHINE))) | |||
ifneq (,$(filter i%86,$(TARGET_PROCESSOR))) | |||
CPU_I386=true | |||
CPU_I386_OR_X86_64=true | |||
endif | |||
ifneq (,$(filter x86_64,$(TARGET_PROCESSOR))) | |||
CPU_X86_64=true | |||
CPU_I386_OR_X86_64=true | |||
endif | |||
ifneq (,$(filter arm%,$(TARGET_PROCESSOR))) | |||
CPU_ARM=true | |||
CPU_ARM_OR_AARCH64=true | |||
endif | |||
ifneq (,$(filter aarch64%,$(TARGET_PROCESSOR))) | |||
CPU_AARCH64=true | |||
CPU_ARM_OR_AARCH64=true | |||
endif | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
# Set PKG_CONFIG (can be overridden by environment variable) | |||
@@ -106,7 +129,15 @@ endif | |||
# Set build and link flags | |||
BASE_FLAGS = -Wall -Wextra -pipe -MD -MP | |||
BASE_OPTS = -O3 -ffast-math -mtune=generic -msse -msse2 -fdata-sections -ffunction-sections | |||
BASE_OPTS = -O3 -ffast-math -mtune=generic -fdata-sections -ffunction-sections | |||
ifeq ($(CPU_I386_OR_X86_64),true) | |||
BASE_OPTS += -msse -msse2 | |||
endif | |||
ifeq ($(CPU_ARM),true) | |||
BASE_OPTS += -mfpu=neon-vfpv4 -mfloat-abi=hard | |||
endif | |||
ifeq ($(MACOS),true) | |||
# MacOS linker flags | |||
@@ -208,18 +239,22 @@ HAVE_LIBLO = $(shell $(PKG_CONFIG) --exists liblo && echo true) | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
# Set Generic DGL stuff | |||
ifeq ($(HAIKU),true) | |||
DGL_SYSTEM_LIBS += -lbe | |||
endif | |||
ifeq ($(MACOS),true) | |||
DGL_SYSTEM_LIBS += -framework Cocoa | |||
DGL_SYSTEM_LIBS += -framework Cocoa | |||
endif | |||
ifeq ($(WINDOWS),true) | |||
DGL_SYSTEM_LIBS += -lgdi32 -lcomdlg32 | |||
DGL_SYSTEM_LIBS += -lgdi32 -lcomdlg32 | |||
endif | |||
ifneq ($(HAIKU_OR_MACOS_OR_WINDOWS),true) | |||
ifeq ($(HAVE_X11),true) | |||
DGL_FLAGS += $(shell $(PKG_CONFIG) --cflags x11) | |||
DGL_SYSTEM_LIBS += $(shell $(PKG_CONFIG) --libs x11) | |||
DGL_FLAGS += $(shell $(PKG_CONFIG) --cflags x11) | |||
DGL_SYSTEM_LIBS += $(shell $(PKG_CONFIG) --libs x11) | |||
endif | |||
endif | |||
@@ -244,6 +279,11 @@ ifeq ($(HAVE_OPENGL),true) | |||
DGL_FLAGS += -DHAVE_OPENGL | |||
ifeq ($(HAIKU),true) | |||
OPENGL_FLAGS = $(shell $(PKG_CONFIG) --cflags gl) | |||
OPENGL_LIBS = $(shell $(PKG_CONFIG) --libs gl) | |||
endif | |||
ifeq ($(MACOS),true) | |||
OPENGL_LIBS = -framework OpenGL | |||
endif | |||
@@ -252,7 +292,7 @@ ifeq ($(WINDOWS),true) | |||
OPENGL_LIBS = -lopengl32 | |||
endif | |||
ifneq ($(MACOS_OR_WINDOWS),true) | |||
ifneq ($(HAIKU_OR_MACOS_OR_WINDOWS),true) | |||
OPENGL_FLAGS = $(shell $(PKG_CONFIG) --cflags gl x11) | |||
OPENGL_LIBS = $(shell $(PKG_CONFIG) --libs gl x11) | |||
endif | |||
@@ -291,3 +331,12 @@ SHARED = -shared | |||
endif | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
# Handle the verbosity switch | |||
ifeq ($(VERBOSE),true) | |||
SILENT = | |||
else | |||
SILENT = @ | |||
endif | |||
# --------------------------------------------------------------------------------------------------------------------- |
@@ -70,8 +70,9 @@ UI_TYPE = opengl | |||
endif | |||
ifeq ($(UI_TYPE),cairo) | |||
DGL_FLAGS += -DDGL_CAIRO | |||
ifeq ($(HAVE_CAIRO),true) | |||
DGL_FLAGS += $(CAIRO_FLAGS) -DDGL_CAIRO | |||
DGL_FLAGS += $(CAIRO_FLAGS) | |||
DGL_LIBS += $(CAIRO_LIBS) | |||
DGL_LIB = $(DPF_PATH)/build/libdgl-cairo.a | |||
HAVE_DGL = true | |||
@@ -81,8 +82,9 @@ endif | |||
endif | |||
ifeq ($(UI_TYPE),opengl) | |||
DGL_FLAGS += -DDGL_OPENGL | |||
ifeq ($(HAVE_OPENGL),true) | |||
DGL_FLAGS += $(OPENGL_FLAGS) -DDGL_OPENGL | |||
DGL_FLAGS += $(OPENGL_FLAGS) | |||
DGL_LIBS += $(OPENGL_LIBS) | |||
DGL_LIB = $(DPF_PATH)/build/libdgl-opengl.a | |||
HAVE_DGL = true | |||
@@ -91,6 +93,11 @@ HAVE_DGL = false | |||
endif | |||
endif | |||
ifeq ($(UI_TYPE),external) | |||
DGL_FLAGS += -DDGL_EXTERNAL | |||
HAVE_DGL = true | |||
endif | |||
DGL_LIBS += $(DGL_SYSTEM_LIBS) | |||
ifneq ($(HAVE_DGL),true) | |||
@@ -114,17 +121,17 @@ all: | |||
$(BUILD_DIR)/%.c.o: %.c | |||
-@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | |||
@echo "Compiling $<" | |||
@$(CC) $< $(BUILD_C_FLAGS) -c -o $@ | |||
$(SILENT)$(CC) $< $(BUILD_C_FLAGS) -c -o $@ | |||
$(BUILD_DIR)/%.cc.o: %.cc | |||
-@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | |||
@echo "Compiling $<" | |||
@$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
$(BUILD_DIR)/%.cpp.o: %.cpp | |||
-@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | |||
@echo "Compiling $<" | |||
@$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
clean: | |||
rm -rf $(BUILD_DIR) | |||
@@ -135,22 +142,22 @@ clean: | |||
$(BUILD_DIR)/DistrhoPluginMain_%.cpp.o: $(DPF_PATH)/distrho/DistrhoPluginMain.cpp | |||
-@mkdir -p $(BUILD_DIR) | |||
@echo "Compiling DistrhoPluginMain.cpp ($*)" | |||
@$(CXX) $< $(BUILD_CXX_FLAGS) -DDISTRHO_PLUGIN_TARGET_$* -c -o $@ | |||
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -DDISTRHO_PLUGIN_TARGET_$* -c -o $@ | |||
$(BUILD_DIR)/DistrhoUIMain_%.cpp.o: $(DPF_PATH)/distrho/DistrhoUIMain.cpp | |||
-@mkdir -p $(BUILD_DIR) | |||
@echo "Compiling DistrhoUIMain.cpp ($*)" | |||
@$(CXX) $< $(BUILD_CXX_FLAGS) -DDISTRHO_PLUGIN_TARGET_$* -c -o $@ | |||
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -DDISTRHO_PLUGIN_TARGET_$* -c -o $@ | |||
$(BUILD_DIR)/DistrhoPluginMain_JACK.cpp.o: $(DPF_PATH)/distrho/DistrhoPluginMain.cpp | |||
-@mkdir -p $(BUILD_DIR) | |||
@echo "Compiling DistrhoPluginMain.cpp (JACK)" | |||
@$(CXX) $< $(BUILD_CXX_FLAGS) $(shell $(PKG_CONFIG) --cflags jack) -DDISTRHO_PLUGIN_TARGET_JACK -c -o $@ | |||
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(shell $(PKG_CONFIG) --cflags jack) -DDISTRHO_PLUGIN_TARGET_JACK -c -o $@ | |||
$(BUILD_DIR)/DistrhoUIMain_DSSI.cpp.o: $(DPF_PATH)/distrho/DistrhoUIMain.cpp | |||
-@mkdir -p $(BUILD_DIR) | |||
@echo "Compiling DistrhoUIMain.cpp (DSSI)" | |||
@$(CXX) $< $(BUILD_CXX_FLAGS) $(shell $(PKG_CONFIG) --cflags liblo) -DDISTRHO_PLUGIN_TARGET_DSSI -c -o $@ | |||
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(shell $(PKG_CONFIG) --cflags liblo) -DDISTRHO_PLUGIN_TARGET_DSSI -c -o $@ | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
# JACK | |||
@@ -164,7 +171,7 @@ $(jack): $(OBJS_DSP) $(BUILD_DIR)/DistrhoPluginMain_JACK.cpp.o | |||
endif | |||
-@mkdir -p $(shell dirname $@) | |||
@echo "Creating JACK standalone for $(NAME)" | |||
@$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(DGL_LIBS) $(shell $(PKG_CONFIG) --libs jack) -o $@ | |||
$(SILENT)$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(DGL_LIBS) $(shell $(PKG_CONFIG) --libs jack) -o $@ | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
# LADSPA | |||
@@ -174,7 +181,7 @@ ladspa: $(ladspa_dsp) | |||
$(ladspa_dsp): $(OBJS_DSP) $(BUILD_DIR)/DistrhoPluginMain_LADSPA.cpp.o | |||
-@mkdir -p $(shell dirname $@) | |||
@echo "Creating LADSPA plugin for $(NAME)" | |||
@$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(SHARED) -o $@ | |||
$(SILENT)$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(SHARED) -o $@ | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
# DSSI | |||
@@ -186,12 +193,12 @@ dssi_ui: $(dssi_ui) | |||
$(dssi_dsp): $(OBJS_DSP) $(BUILD_DIR)/DistrhoPluginMain_DSSI.cpp.o | |||
-@mkdir -p $(shell dirname $@) | |||
@echo "Creating DSSI plugin library for $(NAME)" | |||
@$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(SHARED) -o $@ | |||
$(SILENT)$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(SHARED) -o $@ | |||
$(dssi_ui): $(OBJS_UI) $(BUILD_DIR)/DistrhoUIMain_DSSI.cpp.o $(DGL_LIB) | |||
-@mkdir -p $(shell dirname $@) | |||
@echo "Creating DSSI UI for $(NAME)" | |||
@$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(DGL_LIBS) $(shell $(PKG_CONFIG) --libs liblo) -o $@ | |||
$(SILENT)$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(DGL_LIBS) $(shell $(PKG_CONFIG) --libs liblo) -o $@ | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
# LV2 | |||
@@ -203,17 +210,17 @@ lv2_sep: $(lv2_dsp) $(lv2_ui) | |||
$(lv2): $(OBJS_DSP) $(OBJS_UI) $(BUILD_DIR)/DistrhoPluginMain_LV2.cpp.o $(BUILD_DIR)/DistrhoUIMain_LV2.cpp.o $(DGL_LIB) | |||
-@mkdir -p $(shell dirname $@) | |||
@echo "Creating LV2 plugin for $(NAME)" | |||
@$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(DGL_LIBS) $(SHARED) -o $@ | |||
$(SILENT)$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(DGL_LIBS) $(SHARED) -o $@ | |||
$(lv2_dsp): $(OBJS_DSP) $(BUILD_DIR)/DistrhoPluginMain_LV2.cpp.o | |||
-@mkdir -p $(shell dirname $@) | |||
@echo "Creating LV2 plugin library for $(NAME)" | |||
@$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(SHARED) -o $@ | |||
$(SILENT)$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(SHARED) -o $@ | |||
$(lv2_ui): $(OBJS_UI) $(BUILD_DIR)/DistrhoUIMain_LV2.cpp.o $(DGL_LIB) | |||
-@mkdir -p $(shell dirname $@) | |||
@echo "Creating LV2 plugin UI for $(NAME)" | |||
@$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(DGL_LIBS) $(SHARED) -o $@ | |||
$(SILENT)$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(DGL_LIBS) $(SHARED) -o $@ | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
# VST | |||
@@ -227,7 +234,7 @@ $(vst): $(OBJS_DSP) $(BUILD_DIR)/DistrhoPluginMain_VST.cpp.o | |||
endif | |||
-@mkdir -p $(shell dirname $@) | |||
@echo "Creating VST plugin for $(NAME)" | |||
@$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(DGL_LIBS) $(SHARED) -o $@ | |||
$(SILENT)$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(DGL_LIBS) $(SHARED) -o $@ | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
@@ -36,6 +36,7 @@ List of plugins made with DPF:<br/> | |||
- [Rezonateur](https://github.com/jpcima/rezonateur) | |||
- [QuadraFuzz](https://github.com/jpcima/quadrafuzz) | |||
- [Stone Phaser](https://github.com/jpcima/stone-phaser) | |||
- [Uhhyou Plugins](https://github.com/ryukau/LV2Plugins) | |||
- [Shiru Plugins](https://github.com/linuxmao-org/shiru-plugins) (work in progress) | |||
- [midiomatic](https://github.com/SpotlightKid/midiomatic) (work in progress) | |||
- [osamc-lv2-workshop](https://github.com/osamc-lv2-workshop/lv2-workshop) (simple plugins code examples) | |||
@@ -25,8 +25,13 @@ START_NAMESPACE_DGL | |||
// ----------------------------------------------------------------------- | |||
#ifndef DISTRHO_OS_HAIKU | |||
class ImageAboutWindow : public Window, | |||
public Widget | |||
#else | |||
// crash when creating or opening 2nd window | |||
class ImageAboutWindow | |||
#endif | |||
{ | |||
public: | |||
explicit ImageAboutWindow(Window& parent, const Image& image = Image()); | |||
@@ -34,11 +39,15 @@ public: | |||
void setImage(const Image& image); | |||
#ifndef DISTRHO_OS_HAIKU | |||
protected: | |||
void onDisplay() override; | |||
bool onKeyboard(const KeyboardEvent&) override; | |||
bool onMouse(const MouseEvent&) override; | |||
void onReshape(uint width, uint height) override; | |||
#else | |||
void exec() {} | |||
#endif | |||
private: | |||
Image fImgBackground; | |||
@@ -77,65 +77,65 @@ all: $(TARGETS) | |||
../build/libdgl-cairo.a: $(OBJS_cairo) | |||
-@mkdir -p ../build | |||
@echo "Creating libdgl-cairo.a" | |||
@rm -f $@ | |||
@$(AR) crs $@ $^ | |||
$(SILENT)rm -f $@ | |||
$(SILENT)$(AR) crs $@ $^ | |||
../build/libdgl-opengl.a: $(OBJS_opengl) | |||
-@mkdir -p ../build | |||
@echo "Creating libdgl-opengl.a" | |||
@rm -f $@ | |||
@$(AR) crs $@ $^ | |||
$(SILENT)rm -f $@ | |||
$(SILENT)$(AR) crs $@ $^ | |||
# Compat name, to be removed soon | |||
../build/libdgl.a: ../build/libdgl-opengl.a | |||
@echo "Symlinking libdgl.a" | |||
@ln -sf $< $@ | |||
$(SILENT)ln -sf $< $@ | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
../build/dgl/%.c.o: src/%.c | |||
-@mkdir -p ../build/dgl | |||
@echo "Compiling $<" | |||
@$(CC) $< $(BUILD_C_FLAGS) -c -o $@ | |||
$(SILENT)$(CC) $< $(BUILD_C_FLAGS) -c -o $@ | |||
../build/dgl/%.cpp.o: src/%.cpp | |||
-@mkdir -p ../build/dgl | |||
@echo "Compiling $<" | |||
@$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
../build/dgl/%.cpp.cairo.o: src/%.cpp | |||
-@mkdir -p ../build/dgl | |||
@echo "Compiling $< (Cairo variant)" | |||
@$(CXX) $< $(BUILD_CXX_FLAGS) $(CAIRO_FLAGS) -DDGL_CAIRO -c -o $@ | |||
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(CAIRO_FLAGS) -DDGL_CAIRO -c -o $@ | |||
../build/dgl/Window.cpp.cairo.o: src/Window.cpp src/sofd/* src/pugl/* | |||
-@mkdir -p ../build/dgl | |||
@echo "Compiling $< (Cairo variant)" | |||
@$(CXX) $< $(BUILD_CXX_FLAGS) $(CAIRO_FLAGS) -DDGL_CAIRO -c -o $@ | |||
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(CAIRO_FLAGS) -DDGL_CAIRO -c -o $@ | |||
../build/dgl/Window.mm.cairo.o: src/Window.cpp src/sofd/* src/pugl/* | |||
-@mkdir -p ../build/dgl | |||
@echo "Compiling $< (Cairo variant)" | |||
@$(CXX) $< $(BUILD_CXX_FLAGS) $(CAIRO_FLAGS) -DDGL_CAIRO -ObjC++ -c -o $@ | |||
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(CAIRO_FLAGS) -DDGL_CAIRO -ObjC++ -c -o $@ | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
../build/dgl/%.cpp.opengl.o: src/%.cpp | |||
-@mkdir -p ../build/dgl | |||
@echo "Compiling $< (OpenGL variant)" | |||
@$(CXX) $< $(BUILD_CXX_FLAGS) $(OPENGL_FLAGS) -DDGL_OPENGL -c -o $@ | |||
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(OPENGL_FLAGS) -DDGL_OPENGL -c -o $@ | |||
../build/dgl/Window.cpp.opengl.o: src/Window.cpp src/sofd/* src/pugl/* | |||
-@mkdir -p ../build/dgl | |||
@echo "Compiling $< (OpenGL variant)" | |||
@$(CXX) $< $(BUILD_CXX_FLAGS) $(OPENGL_FLAGS) -DDGL_OPENGL -c -o $@ | |||
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(OPENGL_FLAGS) -DDGL_OPENGL -c -o $@ | |||
../build/dgl/Window.mm.opengl.o: src/Window.cpp src/sofd/* src/pugl/* | |||
-@mkdir -p ../build/dgl | |||
@echo "Compiling $< (OpenGL variant)" | |||
@$(CXX) $< $(BUILD_CXX_FLAGS) $(OPENGL_FLAGS) -DDGL_OPENGL -ObjC++ -c -o $@ | |||
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(OPENGL_FLAGS) -DDGL_OPENGL -ObjC++ -c -o $@ | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
@@ -25,6 +25,7 @@ START_NAMESPACE_DGL | |||
// ----------------------------------------------------------------------- | |||
#ifndef DISTRHO_OS_HAIKU | |||
ImageAboutWindow::ImageAboutWindow(Window& parent, const Image& image) | |||
: Window(parent.getApp(), parent), | |||
Widget((Window&)*this), | |||
@@ -44,6 +45,10 @@ ImageAboutWindow::ImageAboutWindow(Widget* widget, const Image& image) | |||
Window::setSize(image.getSize()); | |||
Window::setTitle("About"); | |||
} | |||
#else | |||
ImageAboutWindow::ImageAboutWindow(Window& parent, const Image& image) : fImgBackground(image) {} | |||
ImageAboutWindow::ImageAboutWindow(Widget* widget, const Image& image) : fImgBackground(image) {} | |||
#endif | |||
void ImageAboutWindow::setImage(const Image& image) | |||
{ | |||
@@ -51,9 +56,12 @@ void ImageAboutWindow::setImage(const Image& image) | |||
return; | |||
fImgBackground = image; | |||
#ifndef DISTRHO_OS_HAIKU | |||
Window::setSize(image.getSize()); | |||
#endif | |||
} | |||
#ifndef DISTRHO_OS_HAIKU | |||
void ImageAboutWindow::onDisplay() | |||
{ | |||
fImgBackground.draw(); | |||
@@ -86,6 +94,7 @@ void ImageAboutWindow::onReshape(uint width, uint height) | |||
Widget::setSize(width, height); | |||
Window::onReshape(width, height); | |||
} | |||
#endif | |||
// ----------------------------------------------------------------------- | |||
@@ -37,14 +37,17 @@ | |||
# pragma GCC diagnostic ignored "-Wimplicit-fallthrough" | |||
#endif | |||
#if defined(DISTRHO_OS_WINDOWS) | |||
# include "pugl/pugl_win.cpp" | |||
# undef max | |||
# undef min | |||
#if defined(DISTRHO_OS_HAIKU) | |||
# define DGL_DEBUG_EVENTS | |||
# include "pugl/pugl_haiku.cpp" | |||
#elif defined(DISTRHO_OS_MAC) | |||
# define PuglWindow DISTRHO_JOIN_MACRO(PuglWindow, DGL_NAMESPACE) | |||
# define PuglOpenGLView DISTRHO_JOIN_MACRO(PuglOpenGLView, DGL_NAMESPACE) | |||
# include "pugl/pugl_osx.m" | |||
#elif defined(DISTRHO_OS_WINDOWS) | |||
# include "pugl/pugl_win.cpp" | |||
# undef max | |||
# undef min | |||
#else | |||
# include <sys/types.h> | |||
# include <unistd.h> | |||
@@ -99,9 +102,10 @@ struct Window::PrivateData { | |||
fTitle(nullptr), | |||
fWidgets(), | |||
fModal(), | |||
#if defined(DISTRHO_OS_WINDOWS) | |||
hwnd(nullptr), | |||
hwndParent(nullptr) | |||
#if defined(DISTRHO_OS_HAIKU) | |||
bApplication(nullptr), | |||
bView(nullptr), | |||
bWindow(nullptr) | |||
#elif defined(DISTRHO_OS_MAC) | |||
fNeedsIdle(true), | |||
mView(nullptr), | |||
@@ -111,6 +115,9 @@ struct Window::PrivateData { | |||
, fOpenFilePanel(nullptr), | |||
fFilePanelDelegate(nullptr) | |||
# endif | |||
#elif defined(DISTRHO_OS_WINDOWS) | |||
hwnd(nullptr), | |||
hwndParent(nullptr) | |||
#else | |||
xDisplay(nullptr), | |||
xWindow(0) | |||
@@ -135,9 +142,10 @@ struct Window::PrivateData { | |||
fTitle(nullptr), | |||
fWidgets(), | |||
fModal(parent.pData), | |||
#if defined(DISTRHO_OS_WINDOWS) | |||
hwnd(nullptr), | |||
hwndParent(nullptr) | |||
#if defined(DISTRHO_OS_HAIKU) | |||
bApplication(nullptr), | |||
bView(nullptr), | |||
bWindow(nullptr) | |||
#elif defined(DISTRHO_OS_MAC) | |||
fNeedsIdle(false), | |||
mView(nullptr), | |||
@@ -147,6 +155,9 @@ struct Window::PrivateData { | |||
, fOpenFilePanel(nullptr), | |||
fFilePanelDelegate(nullptr) | |||
# endif | |||
#elif defined(DISTRHO_OS_WINDOWS) | |||
hwnd(nullptr), | |||
hwndParent(nullptr) | |||
#else | |||
xDisplay(nullptr), | |||
xWindow(0) | |||
@@ -158,11 +169,13 @@ struct Window::PrivateData { | |||
const PuglInternals* const parentImpl(parent.pData->fView->impl); | |||
// NOTE: almost a 1:1 copy of setTransientWinId() | |||
#if defined(DISTRHO_OS_WINDOWS) | |||
hwndParent = parentImpl->hwnd; | |||
SetWindowLongPtr(hwnd, GWLP_HWNDPARENT, (LONG_PTR)hwndParent); | |||
#if defined(DISTRHO_OS_HAIKU) | |||
// TODO | |||
#elif defined(DISTRHO_OS_MAC) | |||
mParentWindow = parentImpl->window; | |||
#elif defined(DISTRHO_OS_WINDOWS) | |||
hwndParent = parentImpl->hwnd; | |||
SetWindowLongPtr(hwnd, GWLP_HWNDPARENT, (LONG_PTR)hwndParent); | |||
#else | |||
XSetTransientForHint(xDisplay, xWindow, parentImpl->win); | |||
#endif | |||
@@ -183,9 +196,10 @@ struct Window::PrivateData { | |||
fTitle(nullptr), | |||
fWidgets(), | |||
fModal(), | |||
#if defined(DISTRHO_OS_WINDOWS) | |||
hwnd(nullptr), | |||
hwndParent(nullptr) | |||
#if defined(DISTRHO_OS_HAIKU) | |||
bApplication(nullptr), | |||
bView(nullptr), | |||
bWindow(nullptr) | |||
#elif defined(DISTRHO_OS_MAC) | |||
fNeedsIdle(parentId == 0), | |||
mView(nullptr), | |||
@@ -195,6 +209,9 @@ struct Window::PrivateData { | |||
, fOpenFilePanel(nullptr), | |||
fFilePanelDelegate(nullptr) | |||
# endif | |||
#elif defined(DISTRHO_OS_WINDOWS) | |||
hwnd(nullptr), | |||
hwndParent(nullptr) | |||
#else | |||
xDisplay(nullptr), | |||
xWindow(0) | |||
@@ -249,9 +266,10 @@ struct Window::PrivateData { | |||
PuglInternals* impl = fView->impl; | |||
#if defined(DISTRHO_OS_WINDOWS) | |||
hwnd = impl->hwnd; | |||
DISTRHO_SAFE_ASSERT(hwnd != 0); | |||
#if defined(DISTRHO_OS_HAIKU) | |||
bApplication = impl->app; | |||
bView = impl->view; | |||
bWindow = impl->window; | |||
#elif defined(DISTRHO_OS_MAC) | |||
mView = impl->view; | |||
mWindow = impl->window; | |||
@@ -261,6 +279,9 @@ struct Window::PrivateData { | |||
} else { | |||
DISTRHO_SAFE_ASSERT(mWindow != nullptr); | |||
} | |||
#elif defined(DISTRHO_OS_WINDOWS) | |||
hwnd = impl->hwnd; | |||
DISTRHO_SAFE_ASSERT(hwnd != 0); | |||
#else | |||
xDisplay = impl->display; | |||
xWindow = impl->win; | |||
@@ -281,7 +302,6 @@ struct Window::PrivateData { | |||
XInternAtom(xDisplay, "_NET_WM_WINDOW_TYPE_NORMAL", False) | |||
}; | |||
XChangeProperty(xDisplay, xWindow, _wt, XA_ATOM, 32, PropModeReplace, (const uchar*)&_wts, 2); | |||
} | |||
#endif | |||
puglEnterContext(fView); | |||
@@ -327,11 +347,15 @@ struct Window::PrivateData { | |||
fTitle = nullptr; | |||
} | |||
#if defined(DISTRHO_OS_WINDOWS) | |||
hwnd = 0; | |||
#if defined(DISTRHO_OS_HAIKU) | |||
bApplication = nullptr; | |||
bView = nullptr; | |||
bWindow = nullptr; | |||
#elif defined(DISTRHO_OS_MAC) | |||
mView = nullptr; | |||
mWindow = nullptr; | |||
#elif defined(DISTRHO_OS_WINDOWS) | |||
hwnd = 0; | |||
#else | |||
xDisplay = nullptr; | |||
xWindow = 0; | |||
@@ -419,10 +443,12 @@ struct Window::PrivateData { | |||
// the mouse position probably changed since the modal appeared, | |||
// so send a mouse motion event to the modal's parent window | |||
#if defined(DISTRHO_OS_WINDOWS) | |||
#if defined(DISTRHO_OS_HAIKU) | |||
// TODO | |||
#elif defined(DISTRHO_OS_MAC) | |||
// TODO | |||
#elif defined(DISTRHO_OS_WINDOWS) | |||
// TODO | |||
#else | |||
int i, wx, wy; | |||
uint u; | |||
@@ -440,13 +466,26 @@ struct Window::PrivateData { | |||
void focus() | |||
{ | |||
DBG("Window focus\n"); | |||
#if defined(DISTRHO_OS_WINDOWS) | |||
SetForegroundWindow(hwnd); | |||
SetActiveWindow(hwnd); | |||
SetFocus(hwnd); | |||
#if defined(DISTRHO_OS_HAIKU) | |||
if (bWindow != nullptr) | |||
{ | |||
if (bWindow->LockLooper()) | |||
{ | |||
bWindow->Activate(true); | |||
bWindow->UnlockLooper(); | |||
} | |||
} | |||
else | |||
{ | |||
bView->MakeFocus(true); | |||
} | |||
#elif defined(DISTRHO_OS_MAC) | |||
if (mWindow != nullptr) | |||
[mWindow makeKeyWindow]; | |||
#elif defined(DISTRHO_OS_WINDOWS) | |||
SetForegroundWindow(hwnd); | |||
SetActiveWindow(hwnd); | |||
SetFocus(hwnd); | |||
#else | |||
XRaiseWindow(xDisplay, xWindow); | |||
XSetInputFocus(xDisplay, xWindow, RevertToPointerRoot, CurrentTime); | |||
@@ -476,38 +515,28 @@ struct Window::PrivateData { | |||
if (yesNo && fFirstInit) | |||
setSize(fWidth, fHeight, true); | |||
#if defined(DISTRHO_OS_WINDOWS) | |||
if (yesNo) | |||
#if defined(DISTRHO_OS_HAIKU) | |||
if (bWindow != nullptr) | |||
{ | |||
if (fFirstInit) | |||
if (bWindow->LockLooper()) | |||
{ | |||
RECT rectChild, rectParent; | |||
if (hwndParent != nullptr && | |||
GetWindowRect(hwnd, &rectChild) && | |||
GetWindowRect(hwndParent, &rectParent)) | |||
{ | |||
SetWindowPos(hwnd, hwndParent, | |||
rectParent.left + (rectChild.right-rectChild.left)/2, | |||
rectParent.top + (rectChild.bottom-rectChild.top)/2, | |||
0, 0, SWP_SHOWWINDOW|SWP_NOSIZE); | |||
} | |||
if (yesNo) | |||
bWindow->Show(); | |||
else | |||
{ | |||
ShowWindow(hwnd, SW_SHOWNORMAL); | |||
} | |||
} | |||
else | |||
{ | |||
ShowWindow(hwnd, SW_RESTORE); | |||
bWindow->Hide(); | |||
// TODO use flush? | |||
bWindow->Sync(); | |||
bWindow->UnlockLooper(); | |||
} | |||
} | |||
else | |||
{ | |||
ShowWindow(hwnd, SW_HIDE); | |||
if (yesNo) | |||
bView->Show(); | |||
else | |||
bView->Hide(); | |||
} | |||
UpdateWindow(hwnd); | |||
#elif defined(DISTRHO_OS_MAC) | |||
if (yesNo) | |||
{ | |||
@@ -538,6 +567,38 @@ struct Window::PrivateData { | |||
[mView setHidden:YES]; | |||
} | |||
} | |||
#elif defined(DISTRHO_OS_WINDOWS) | |||
if (yesNo) | |||
{ | |||
if (fFirstInit) | |||
{ | |||
RECT rectChild, rectParent; | |||
if (hwndParent != nullptr && | |||
GetWindowRect(hwnd, &rectChild) && | |||
GetWindowRect(hwndParent, &rectParent)) | |||
{ | |||
SetWindowPos(hwnd, hwndParent, | |||
rectParent.left + (rectChild.right-rectChild.left)/2, | |||
rectParent.top + (rectChild.bottom-rectChild.top)/2, | |||
0, 0, SWP_SHOWWINDOW|SWP_NOSIZE); | |||
} | |||
else | |||
{ | |||
ShowWindow(hwnd, SW_SHOWNORMAL); | |||
} | |||
} | |||
else | |||
{ | |||
ShowWindow(hwnd, SW_RESTORE); | |||
} | |||
} | |||
else | |||
{ | |||
ShowWindow(hwnd, SW_HIDE); | |||
} | |||
UpdateWindow(hwnd); | |||
#else | |||
if (yesNo) | |||
XMapRaised(xDisplay, xWindow); | |||
@@ -579,13 +640,18 @@ struct Window::PrivateData { | |||
fResizable = yesNo; | |||
fView->user_resizable = yesNo; | |||
#if defined(DISTRHO_OS_WINDOWS) | |||
#if defined(DISTRHO_OS_HAIKU) | |||
// TODO | |||
// B_NO_BORDER | |||
// B_TITLED_WINDOW_LOOK | |||
// bWindow->SetFlags(); | |||
#elif defined(DISTRHO_OS_MAC) | |||
const uint flags = yesNo ? (NSViewWidthSizable|NSViewHeightSizable) : 0x0; | |||
[mView setAutoresizingMask:flags]; | |||
#elif defined(DISTRHO_OS_WINDOWS) | |||
const int winFlags = fResizable ? GetWindowLong(hwnd, GWL_STYLE) | WS_SIZEBOX | |||
: GetWindowLong(hwnd, GWL_STYLE) & ~WS_SIZEBOX; | |||
SetWindowLong(hwnd, GWL_STYLE, winFlags); | |||
#elif defined(DISTRHO_OS_MAC) | |||
const uint flags(yesNo ? (NSViewWidthSizable|NSViewHeightSizable) : 0x0); | |||
[mView setAutoresizingMask:flags]; | |||
#endif | |||
setSize(fWidth, fHeight, true); | |||
@@ -624,16 +690,20 @@ struct Window::PrivateData { | |||
DBGp("Window setSize called %s, size %i %i, resizable %s\n", forced ? "(forced)" : "(not forced)", width, height, fResizable?"true":"false"); | |||
#if defined(DISTRHO_OS_WINDOWS) | |||
const int winFlags = WS_POPUPWINDOW | WS_CAPTION | (fResizable ? WS_SIZEBOX : 0x0); | |||
RECT wr = { 0, 0, static_cast<LONG>(width), static_cast<LONG>(height) }; | |||
AdjustWindowRectEx(&wr, fUsingEmbed ? WS_CHILD : winFlags, FALSE, WS_EX_TOPMOST); | |||
#if defined(DISTRHO_OS_HAIKU) | |||
bView->ResizeTo(width, height); | |||
SetWindowPos(hwnd, 0, 0, 0, wr.right-wr.left, wr.bottom-wr.top, | |||
SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOOWNERZORDER|SWP_NOZORDER); | |||
if (bWindow != nullptr && bWindow->LockLooper()) | |||
{ | |||
bWindow->MoveTo(50, 50); | |||
bWindow->ResizeTo(width, height); | |||
if (! forced) | |||
UpdateWindow(hwnd); | |||
if (! forced) | |||
bWindow->Flush(); | |||
bWindow->UnlockLooper(); | |||
} | |||
// TODO resizable | |||
#elif defined(DISTRHO_OS_MAC) | |||
[mView setFrame:NSMakeRect(0, 0, width, height)]; | |||
@@ -655,6 +725,16 @@ struct Window::PrivateData { | |||
[[mWindow standardWindowButton:NSWindowZoomButton] setHidden:YES]; | |||
} | |||
} | |||
#elif defined(DISTRHO_OS_WINDOWS) | |||
const int winFlags = WS_POPUPWINDOW | WS_CAPTION | (fResizable ? WS_SIZEBOX : 0x0); | |||
RECT wr = { 0, 0, static_cast<LONG>(width), static_cast<LONG>(height) }; | |||
AdjustWindowRectEx(&wr, fUsingEmbed ? WS_CHILD : winFlags, FALSE, WS_EX_TOPMOST); | |||
SetWindowPos(hwnd, 0, 0, 0, wr.right-wr.left, wr.bottom-wr.top, | |||
SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOOWNERZORDER|SWP_NOZORDER); | |||
if (! forced) | |||
UpdateWindow(hwnd); | |||
#else | |||
if (! fResizable) | |||
@@ -700,8 +780,12 @@ struct Window::PrivateData { | |||
fTitle = strdup(title); | |||
#if defined(DISTRHO_OS_WINDOWS) | |||
SetWindowTextA(hwnd, title); | |||
#if defined(DISTRHO_OS_HAIKU) | |||
if (bWindow != nullptr&& bWindow->LockLooper()) | |||
{ | |||
bWindow->SetTitle(title); | |||
bWindow->UnlockLooper(); | |||
} | |||
#elif defined(DISTRHO_OS_MAC) | |||
if (mWindow != nullptr) | |||
{ | |||
@@ -712,6 +796,8 @@ struct Window::PrivateData { | |||
[mWindow setTitle:titleString]; | |||
} | |||
#elif defined(DISTRHO_OS_WINDOWS) | |||
SetWindowTextA(hwnd, title); | |||
#else | |||
XStoreName(xDisplay, xWindow, title); | |||
Atom netWmName = XInternAtom(xDisplay, "_NET_WM_NAME", False); | |||
@@ -724,15 +810,17 @@ struct Window::PrivateData { | |||
{ | |||
DISTRHO_SAFE_ASSERT_RETURN(winId != 0,); | |||
#if defined(DISTRHO_OS_WINDOWS) | |||
hwndParent = (HWND)winId; | |||
SetWindowLongPtr(hwnd, GWLP_HWNDPARENT, (LONG_PTR)winId); | |||
#if defined(DISTRHO_OS_HAIKU) | |||
// TODO | |||
#elif defined(DISTRHO_OS_MAC) | |||
NSWindow* const parentWindow = [NSApp windowWithWindowNumber:winId]; | |||
DISTRHO_SAFE_ASSERT_RETURN(parentWindow != nullptr,); | |||
[parentWindow addChildWindow:mWindow | |||
ordered:NSWindowAbove]; | |||
#elif defined(DISTRHO_OS_WINDOWS) | |||
hwndParent = (HWND)winId; | |||
SetWindowLongPtr(hwnd, GWLP_HWNDPARENT, (LONG_PTR)winId); | |||
#else | |||
XSetTransientForHint(xDisplay, xWindow, static_cast< ::Window>(winId)); | |||
#endif | |||
@@ -780,6 +868,15 @@ struct Window::PrivateData { | |||
{ | |||
puglProcessEvents(fView); | |||
#ifdef DISTRHO_OS_HAIKU | |||
if (bApplication != nullptr) | |||
{ | |||
// bApplication->Lock(); | |||
// bApplication->Loop(); | |||
// bApplication->Unlock(); | |||
} | |||
#endif | |||
#ifdef DISTRHO_OS_MAC | |||
if (fNeedsIdle) | |||
{ | |||
@@ -1164,12 +1261,10 @@ struct Window::PrivateData { | |||
DISTRHO_DECLARE_NON_COPY_STRUCT(Modal) | |||
} fModal; | |||
#if defined(DISTRHO_OS_WINDOWS) | |||
HWND hwnd; | |||
HWND hwndParent; | |||
# ifndef DGL_FILE_BROWSER_DISABLED | |||
String fSelectedFile; | |||
# endif | |||
#if defined(DISTRHO_OS_HAIKU) | |||
BApplication* bApplication; | |||
BView* bView; | |||
BWindow* bWindow; | |||
#elif defined(DISTRHO_OS_MAC) | |||
bool fNeedsIdle; | |||
NSView<PuglGenericView>* mView; | |||
@@ -1179,6 +1274,12 @@ struct Window::PrivateData { | |||
NSOpenPanel* fOpenFilePanel; | |||
id fFilePanelDelegate; | |||
# endif | |||
#elif defined(DISTRHO_OS_WINDOWS) | |||
HWND hwnd; | |||
HWND hwndParent; | |||
# ifndef DGL_FILE_BROWSER_DISABLED | |||
String fSelectedFile; | |||
# endif | |||
#else | |||
Display* xDisplay; | |||
::Window xWindow; | |||
@@ -0,0 +1,441 @@ | |||
/* | |||
Copyright 2019 Filipe Coelho <falktx@falktx.com> | |||
Permission to use, copy, modify, and/or distribute this software for any | |||
purpose with or without fee is hereby granted, provided that the above | |||
copyright notice and this permission notice appear in all copies. | |||
THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
*/ | |||
/** | |||
@file pugl_haiku.cpp BeOS/HaikuOS Pugl Implementation. | |||
*/ | |||
#include <Application.h> | |||
#include <interface/Window.h> | |||
#ifdef PUGL_CAIRO | |||
#include <cairo/cairo.h> | |||
typedef BView BViewType; | |||
#endif | |||
#ifdef PUGL_OPENGL | |||
#include <GL/gl.h> | |||
#include <opengl/GLView.h> | |||
typedef BGLView BViewType; | |||
#endif | |||
#include "pugl_internal.h" | |||
class DWindow; | |||
struct PuglInternalsImpl { | |||
BApplication* app; | |||
BViewType* view; | |||
DWindow* window; | |||
}; | |||
static void | |||
puglReshape(PuglView* view, int width, int height) | |||
{ | |||
puglEnterContext(view); | |||
if (view->reshapeFunc) { | |||
view->reshapeFunc(view, width, height); | |||
} else { | |||
puglDefaultReshape(width, height); | |||
} | |||
puglLeaveContext(view, false); | |||
view->width = width; | |||
view->height = height; | |||
} | |||
static void | |||
puglDisplay(PuglView* view) | |||
{ | |||
puglEnterContext(view); | |||
view->redisplay = false; | |||
if (view->displayFunc) { | |||
view->displayFunc(view); | |||
} | |||
puglLeaveContext(view, true); | |||
} | |||
void | |||
puglEnterContext(PuglView* view) | |||
{ | |||
PuglInternals* impl = view->impl; | |||
#ifdef PUGL_OPENGL | |||
// FIXME without the first unlock we freeze | |||
impl->view->UnlockGL(); | |||
impl->view->LockGL(); | |||
#endif | |||
} | |||
void | |||
puglLeaveContext(PuglView* view, bool flush) | |||
{ | |||
PuglInternals* impl = view->impl; | |||
#ifdef PUGL_OPENGL | |||
if (flush) | |||
impl->view->SwapBuffers(); | |||
impl->view->UnlockGL(); | |||
#endif | |||
} | |||
PuglInternals* | |||
puglInitInternals() | |||
{ | |||
return (PuglInternals*)calloc(1, sizeof(PuglInternals)); | |||
} | |||
class DView : public BViewType | |||
{ | |||
public: | |||
#ifdef PUGL_CAIRO | |||
DView(PuglView* const v) | |||
: BView(nullptr, | |||
B_FULL_UPDATE_ON_RESIZE|B_WILL_DRAW|B_FRAME_EVENTS|B_NAVIGABLE|B_INPUT_METHOD_AWARE), | |||
puglView(v) {} | |||
#endif | |||
#ifdef PUGL_OPENGL | |||
DView(PuglView* const v) | |||
: BGLView(BRect(), // causes "bitmap bounds is much too large: BRect(0.0, 0.0, 4294967296.0, 4294967296.0)" | |||
"DPF-GLView", | |||
0x0, // resize mode | |||
B_FULL_UPDATE_ON_RESIZE|B_WILL_DRAW|B_NAVIGABLE_JUMP|B_FRAME_EVENTS|B_NAVIGABLE|B_INPUT_METHOD_AWARE, | |||
BGL_RGB|BGL_DOUBLE|BGL_ALPHA|BGL_DEPTH|BGL_STENCIL), | |||
puglView(v) | |||
{ | |||
} | |||
#endif | |||
protected: | |||
void GetPreferredSize(float* width, float* height) override | |||
{ | |||
d_stdout("%s %i", __func__, __LINE__); | |||
if (width != nullptr) | |||
*width = puglView->width; | |||
if (height != nullptr) | |||
*height = puglView->height; | |||
d_stdout("%s %i", __func__, __LINE__); | |||
} | |||
void Draw(BRect updateRect) override | |||
{ | |||
d_stdout("%s %i", __func__, __LINE__); | |||
puglDisplay(puglView); | |||
#ifdef PUGL_OPENGL | |||
BGLView::Draw(updateRect); | |||
d_stdout("%s %i", __func__, __LINE__); | |||
#endif | |||
} | |||
void MessageReceived(BMessage* message) | |||
{ | |||
d_stdout("MessageReceived %p", message); | |||
BViewType::MessageReceived(message); | |||
} | |||
void MouseDown(BPoint where) override | |||
{ | |||
if (puglView->mouseFunc) { | |||
// puglView->event_timestamp_ms = GetMessageTime(); | |||
d_stdout("MouseDown mask %u", EventMask()); | |||
puglView->mouseFunc(puglView, 1, true, where.x, where.y); | |||
SetMouseEventMask(B_POINTER_EVENTS, B_LOCK_WINDOW_FOCUS); | |||
} | |||
//BViewType::MouseDown(where); | |||
} | |||
void MouseUp(BPoint where) override | |||
{ | |||
if (puglView->mouseFunc) { | |||
d_stdout("MouseUp mask %u", EventMask()); | |||
// puglView->event_timestamp_ms = GetMessageTime(); | |||
puglView->mouseFunc(puglView, 1, false, where.x, where.y); | |||
} | |||
//BViewType::MouseUp(where); | |||
} | |||
void MouseMoved(BPoint where, uint32, const BMessage*) override | |||
{ | |||
if (puglView->motionFunc) { | |||
// puglView->event_timestamp_ms = GetMessageTime(); | |||
puglView->motionFunc(puglView, where.x, where.y); | |||
} | |||
} | |||
void KeyDown(const char* bytes, int32 numBytes) override | |||
{ | |||
d_stdout("KeyDown %i", numBytes); | |||
if (numBytes != 1) | |||
return; // TODO | |||
if (puglView->keyboardFunc) { | |||
puglView->keyboardFunc(puglView, true, bytes[0]); | |||
} | |||
} | |||
void KeyUp(const char* bytes, int32 numBytes) override | |||
{ | |||
d_stdout("KeyUp %i", numBytes); | |||
if (numBytes != 1) | |||
return; // TODO | |||
if (puglView->keyboardFunc) { | |||
puglView->keyboardFunc(puglView, false, bytes[0]); | |||
} | |||
} | |||
void ScrollTo(BPoint where) override | |||
{ | |||
d_stdout("ScrollTo mask %u", EventMask()); | |||
BViewType::ScrollTo(where); | |||
} | |||
void FrameResized(float newWidth, float newHeight) override | |||
{ | |||
d_stdout("%s %i", __func__, __LINE__); | |||
puglReshape(puglView, static_cast<int>(newWidth), static_cast<int>(newHeight)); | |||
#ifdef PUGL_OPENGL | |||
BGLView::FrameResized(newWidth, newHeight); | |||
#endif | |||
d_stdout("%s %i", __func__, __LINE__); | |||
} | |||
private: | |||
PuglView* const puglView; | |||
}; | |||
class DWindow : public BWindow | |||
{ | |||
public: | |||
DWindow(PuglView* const v) | |||
: BWindow(BRect(1.0f), "DPF-Window", B_TITLED_WINDOW, 0x0), | |||
puglView(v), | |||
needsQuit(true) | |||
{ | |||
} | |||
bool NeedsQuit() const | |||
{ | |||
return needsQuit; | |||
} | |||
protected: | |||
bool QuitRequested() override | |||
{ | |||
d_stdout("%s %i", __func__, __LINE__); | |||
if (puglView->closeFunc) { | |||
puglView->closeFunc(puglView); | |||
puglView->redisplay = false; | |||
} | |||
needsQuit = false; | |||
d_stdout("%s %i", __func__, __LINE__); | |||
return true; | |||
} | |||
private: | |||
PuglView* const puglView; | |||
bool needsQuit; | |||
}; | |||
int | |||
puglCreateWindow(PuglView* view, const char* title) | |||
{ | |||
PuglInternals* impl = view->impl; | |||
if (be_app == nullptr) | |||
{ | |||
d_stdout("creating app"); | |||
status_t status; | |||
BApplication* const app = new BApplication("application/x-vnd.dpf-application", &status); | |||
if (status != B_OK) | |||
{ | |||
d_stdout("app status error %u", status); | |||
delete app; | |||
return 1; | |||
} | |||
impl->app = app; | |||
} | |||
else | |||
{ | |||
d_stdout("using existing app"); | |||
} | |||
if (view->parent == 0) { | |||
impl->window = new DWindow(view); | |||
impl->window->Lock(); | |||
} | |||
impl->view = new DView(view); | |||
if (view->parent != 0) { | |||
BView* const pview = (BView*)view->parent; | |||
pview->AddChild(impl->view); | |||
impl->view->LockGL(); | |||
return 0; | |||
} | |||
if (title != nullptr) { | |||
impl->window->SetTitle(title); | |||
} | |||
impl->window->AddChild(impl->view); | |||
impl->view->LockGL(); | |||
//puglEnterContext(view); | |||
impl->window->Unlock(); | |||
return 0; | |||
} | |||
void | |||
puglShowWindow(PuglView* view) | |||
{ | |||
PuglInternals* impl = view->impl; | |||
if (impl->window != nullptr) | |||
{ | |||
if (impl->window->LockLooper()) | |||
{ | |||
impl->window->Show(); | |||
impl->window->UnlockLooper(); | |||
} | |||
} | |||
else | |||
{ | |||
impl->view->Show(); | |||
} | |||
} | |||
void | |||
puglHideWindow(PuglView* view) | |||
{ | |||
PuglInternals* impl = view->impl; | |||
if (impl->window != nullptr) | |||
{ | |||
if (impl->window->LockLooper()) | |||
{ | |||
impl->window->Hide(); | |||
impl->window->UnlockLooper(); | |||
} | |||
} | |||
else | |||
{ | |||
impl->view->Show(); | |||
} | |||
} | |||
void | |||
puglDestroy(PuglView* view) | |||
{ | |||
PuglInternals* impl = view->impl; | |||
if (impl->window != nullptr) | |||
{ | |||
// impl->window->Lock(); | |||
puglLeaveContext(view, false); | |||
impl->window->RemoveChild(impl->view); | |||
// impl->window->Unlock(); | |||
if (impl->window->NeedsQuit()) | |||
impl->window->Quit(); | |||
} | |||
delete impl->view; | |||
impl->view = nullptr; | |||
impl->window = nullptr; | |||
if (impl->app != nullptr && impl->app->CountWindows() == 0) | |||
{ | |||
d_stdout("deleting app"); | |||
delete impl->app; | |||
impl->app = nullptr; | |||
} else | |||
d_stdout("NOT deleting app"); | |||
} | |||
PuglStatus | |||
puglProcessEvents(PuglView* view) | |||
{ | |||
return PUGL_SUCCESS; | |||
} | |||
void | |||
puglPostRedisplay(PuglView* view) | |||
{ | |||
PuglInternals* impl = view->impl; | |||
view->redisplay = true; | |||
if (impl->window != nullptr) | |||
{ | |||
if (impl->window->LockLooper()) | |||
{ | |||
impl->view->Invalidate(); | |||
impl->window->UnlockLooper(); | |||
} | |||
} | |||
else | |||
{ | |||
impl->view->Invalidate(); | |||
} | |||
} | |||
PuglNativeWindow | |||
puglGetNativeWindow(PuglView* view) | |||
{ | |||
PuglInternals* impl = view->impl; | |||
#ifdef PUGL_OPENGL | |||
// return (PuglNativeWindow)impl->view->EmbeddedView(); | |||
#endif | |||
return (PuglNativeWindow)(BView*)impl->view; | |||
} | |||
void* | |||
puglGetContext(PuglView* view) | |||
{ | |||
return NULL; | |||
} | |||
int | |||
puglUpdateGeometryConstraints(PuglView* view, int min_width, int min_height, bool aspect) | |||
{ | |||
PuglInternals* impl = view->impl; | |||
d_stdout("puglUpdateGeometryConstraints %i %i %i %i", min_width, min_height, view->width, view->height); | |||
if (impl->window->LockLooper()) | |||
{ | |||
impl->window->SetSizeLimits(min_width, | |||
view->user_resizable ? 4096 : min_width, | |||
min_height, | |||
view->user_resizable ? 4096 : min_height); | |||
impl->window->UnlockLooper(); | |||
return 0; | |||
} | |||
return 1; | |||
// TODO | |||
(void)aspect; | |||
} |
@@ -392,8 +392,6 @@ handleMessage(PuglView* view, UINT message, WPARAM wParam, LPARAM lParam) | |||
case WM_SIZE: | |||
GetClientRect(view->impl->hwnd, &rect); | |||
puglReshape(view, rect.right, rect.bottom); | |||
view->width = rect.right; | |||
view->height = rect.bottom; | |||
break; | |||
case WM_GETMINMAXINFO: | |||
mmi = (MINMAXINFO*)lParam; | |||
@@ -365,6 +365,8 @@ struct ParameterEnumerationValues { | |||
values = nullptr; | |||
} | |||
} | |||
DISTRHO_DECLARE_NON_COPY_STRUCT(ParameterEnumerationValues) | |||
}; | |||
/** | |||
@@ -128,7 +128,12 @@ private: \ | |||
StructName& operator=(StructName&) = delete; \ | |||
StructName& operator=(const StructName&) = delete; | |||
#else | |||
# define DISTRHO_DECLARE_NON_COPY_STRUCT(StructName) | |||
# define DISTRHO_DECLARE_NON_COPY_STRUCT(StructName) \ | |||
private: \ | |||
StructName(StructName&); \ | |||
StructName(const StructName&); \ | |||
StructName& operator=(StructName&); \ | |||
StructName& operator=(const StructName&); | |||
#endif | |||
/* Define DISTRHO_PREVENT_HEAP_ALLOCATION */ | |||
@@ -97,7 +97,7 @@ | |||
// Define DISTRHO_PLUGIN_HAS_EMBED_UI if needed | |||
#ifndef DISTRHO_PLUGIN_HAS_EMBED_UI | |||
# if defined(HAVE_CAIRO) || defined(HAVE_OPENGL) | |||
# if (defined(DGL_CAIRO) && defined(HAVE_CAIRO)) || (defined(DGL_OPENGL) && defined(HAVE_OPENGL)) | |||
# define DISTRHO_PLUGIN_HAS_EMBED_UI 1 | |||
# else | |||
# define DISTRHO_PLUGIN_HAS_EMBED_UI 0 | |||
@@ -139,7 +139,12 @@ | |||
// ----------------------------------------------------------------------- | |||
// Disable UI if DGL or External UI is not available | |||
#if DISTRHO_PLUGIN_HAS_UI && ! DISTRHO_PLUGIN_HAS_EXTERNAL_UI && ! defined(HAVE_CAIRO) && ! defined(HAVE_OPENGL) | |||
#if (defined(DGL_CAIRO) && ! defined(HAVE_CAIRO)) || (defined(DGL_OPENGL) && ! defined(HAVE_OPENGL)) | |||
# undef DISTRHO_PLUGIN_HAS_EMBED_UI | |||
# define DISTRHO_PLUGIN_HAS_EMBED_UI 0 | |||
#endif | |||
#if DISTRHO_PLUGIN_HAS_UI && ! DISTRHO_PLUGIN_HAS_EMBED_UI && ! DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
# undef DISTRHO_PLUGIN_HAS_UI | |||
# define DISTRHO_PLUGIN_HAS_UI 0 | |||
#endif | |||
@@ -166,6 +166,44 @@ public: | |||
// ------------------------------------------------------------------- | |||
bool getPortControlValue(uint32_t index, float& value) const | |||
{ | |||
if (const float* control = fPortControls[index]) | |||
{ | |||
switch (fPlugin.getParameterDesignation(index)) | |||
{ | |||
default: | |||
value = *control; | |||
break; | |||
case kParameterDesignationBypass: | |||
value = 1.0f - *control; | |||
break; | |||
} | |||
return true; | |||
} | |||
return false; | |||
} | |||
void setPortControlValue(uint32_t index, float value) | |||
{ | |||
if (float* control = fPortControls[index]) | |||
{ | |||
switch (fPlugin.getParameterDesignation(index)) | |||
{ | |||
default: | |||
*control = value; | |||
break; | |||
case kParameterDesignationBypass: | |||
*control = 1.0f - value; | |||
break; | |||
} | |||
} | |||
} | |||
// ------------------------------------------------------------------- | |||
void lv2_activate() | |||
{ | |||
#if DISTRHO_PLUGIN_WANT_TIMEPOS | |||
@@ -514,18 +552,13 @@ public: | |||
for (uint32_t i=0, count=fPlugin.getParameterCount(); i < count; ++i) | |||
{ | |||
if (fPortControls[i] == nullptr) | |||
if (!getPortControlValue(i, curValue)) | |||
continue; | |||
curValue = *fPortControls[i]; | |||
if (fPlugin.isParameterInput(i) && d_isNotEqual(fLastControlValues[i], curValue)) | |||
{ | |||
fLastControlValues[i] = curValue; | |||
if (fPlugin.getParameterDesignation(i) == kParameterDesignationBypass) | |||
curValue = 1.0f - curValue; | |||
fPlugin.setParameterValue(i, curValue); | |||
} | |||
} | |||
@@ -757,8 +790,7 @@ public: | |||
fLastControlValues[i] = fPlugin.getParameterValue(i); | |||
if (fPortControls[i] != nullptr) | |||
*fPortControls[i] = fLastControlValues[i]; | |||
setPortControlValue(i, fLastControlValues[i]); | |||
} | |||
# if DISTRHO_PLUGIN_WANT_FULL_STATE | |||
@@ -1047,8 +1079,7 @@ private: | |||
{ | |||
curValue = fLastControlValues[i] = fPlugin.getParameterValue(i); | |||
if (fPortControls[i] != nullptr) | |||
*fPortControls[i] = curValue; | |||
setPortControlValue(i, curValue); | |||
} | |||
else if ((fPlugin.getParameterHints(i) & kParameterIsTrigger) == kParameterIsTrigger) | |||
{ | |||
@@ -160,7 +160,7 @@ static const char* const lv2ManifestUiSupportedOptions[] = | |||
}; | |||
#endif // DISTRHO_PLUGIN_HAS_UI | |||
static void addAttribute(String& text, | |||
static void addAttribute(DISTRHO_NAMESPACE::String& text, | |||
const char* const attribute, | |||
const char* const values[], | |||
const uint indent, | |||
@@ -561,7 +561,14 @@ void lv2_generate_ttl(const char* const basename) | |||
pluginString += " [\n"; | |||
pluginString += " rdfs:label \"\"\"" + enumValue.label + "\"\"\" ;\n"; | |||
pluginString += " rdf:value " + String(enumValue.value) + " ;\n"; | |||
if (plugin.getParameterHints(i) & kParameterIsInteger) { | |||
const int roundedValue = (int)(enumValue.value + 0.5f); | |||
pluginString += " rdf:value " + String(roundedValue) + " ;\n"; | |||
} | |||
else { | |||
pluginString += " rdf:value " + String(enumValue.value) + " ;\n"; | |||
} | |||
if (j+1 == enumValues.count) | |||
pluginString += " ] ;\n\n"; | |||
@@ -606,6 +613,7 @@ void lv2_generate_ttl(const char* const basename) | |||
else | |||
{ | |||
pluginString += " unit:unit [\n"; | |||
pluginString += " a unit:Unit ;\n"; | |||
pluginString += " rdfs:label \"" + unit + "\" ;\n"; | |||
pluginString += " unit:symbol \"" + unit + "\" ;\n"; | |||
pluginString += " unit:render \"%f " + unit + "\" ;\n"; | |||
@@ -231,6 +231,8 @@ public: | |||
d_stdout("handlePluginKeyEvent %i %i %li\n", down, index, (long int)value); | |||
using namespace DGL_NAMESPACE; | |||
int special = 0; | |||
switch (value) | |||
{ | |||
@@ -588,7 +590,8 @@ public: | |||
return 1; | |||
case effEditOpen: | |||
if (fVstUI == nullptr) | |||
delete fVstUI; // hosts which don't pair effEditOpen/effEditClose calls (Minihost Modular) | |||
fVstUI = nullptr; | |||
{ | |||
# if DISTRHO_OS_MAC | |||
if (! fUsingNsView) | |||
@@ -920,25 +923,25 @@ public: | |||
return ranges.getNormalizedValue(fPlugin.getParameterValue(index)); | |||
} | |||
void vst_setParameter(const int32_t index, float value) | |||
void vst_setParameter(const int32_t index, const float value) | |||
{ | |||
const uint32_t hints(fPlugin.getParameterHints(index)); | |||
const ParameterRanges& ranges(fPlugin.getParameterRanges(index)); | |||
value = ranges.getUnnormalizedValue(value); | |||
// TODO figure out how to detect kVstParameterUsesIntegerMinMax host support, and skip normalization | |||
float realValue = ranges.getUnnormalizedValue(value); | |||
if (hints & kParameterIsBoolean) | |||
{ | |||
const float midRange = ranges.min + (ranges.max - ranges.min) / 2.0f; | |||
value = value > midRange ? ranges.max : ranges.min; | |||
realValue = realValue > midRange ? ranges.max : ranges.min; | |||
} | |||
if (hints & kParameterIsInteger) | |||
{ | |||
value = std::round(value); | |||
realValue = std::round(realValue); | |||
} | |||
const float realValue(value); | |||
fPlugin.setParameterValue(index, realValue); | |||
#if DISTRHO_PLUGIN_HAS_UI | |||
@@ -149,9 +149,12 @@ public: | |||
fUI.setSampleRate(sampleRate, true); | |||
} | |||
void dssiui_show() | |||
void dssiui_show(const bool focus = false) | |||
{ | |||
fUI.setWindowVisible(true); | |||
if (focus) | |||
fUI.focus(); | |||
} | |||
void dssiui_hide() | |||
@@ -389,7 +392,7 @@ int main(int argc, char* argv[]) | |||
gUiTitle = "DSSI UI Test"; | |||
initUiIfNeeded(); | |||
globalUI->dssiui_show(); | |||
globalUI->dssiui_show(true); | |||
globalUI->exec(); | |||
delete globalUI; | |||
@@ -406,6 +406,10 @@ public: | |||
return true; | |||
} | |||
void focus() | |||
{ | |||
} | |||
void quit() | |||
{ | |||
DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr,); | |||
@@ -430,6 +434,11 @@ public: | |||
fUI->uiIdle(); | |||
} | |||
void focus() | |||
{ | |||
glWindow.focus(); | |||
} | |||
bool idle() | |||
{ | |||
DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr, false); | |||
@@ -519,7 +528,7 @@ public: | |||
return glWindow.handlePluginKeyboard(press, key); | |||
} | |||
bool handlePluginSpecial(const bool press, const Key key) | |||
bool handlePluginSpecial(const bool press, const DGL_NAMESPACE::Key key) | |||
{ | |||
return glWindow.handlePluginSpecial(press, key); | |||
} | |||
@@ -19,6 +19,10 @@ | |||
#include "Cairo.hpp" | |||
#include "Window.hpp" | |||
START_NAMESPACE_DGL | |||
// ----------------------------------------------------------------------- | |||
static const char* banner = | |||
" " | |||
" * * * * * " | |||
@@ -90,3 +94,7 @@ void DemoWidgetBanner::onDisplay() | |||
} | |||
} | |||
} | |||
// ----------------------------------------------------------------------- | |||
END_NAMESPACE_DGL |
@@ -16,9 +16,19 @@ | |||
#include "Widget.hpp" | |||
START_NAMESPACE_DGL | |||
// ----------------------------------------------------------------------- | |||
class DemoWidgetBanner : public Widget | |||
{ | |||
public: | |||
explicit DemoWidgetBanner(Widget* group); | |||
void onDisplay() override; | |||
}; | |||
// ----------------------------------------------------------------------- | |||
END_NAMESPACE_DGL | |||
using DGL_NAMESPACE::DemoWidgetBanner; |
@@ -19,6 +19,10 @@ | |||
#include "Cairo.hpp" | |||
#include "Window.hpp" | |||
START_NAMESPACE_DGL | |||
// ----------------------------------------------------------------------- | |||
DemoWidgetClickable::DemoWidgetClickable(Widget* group) | |||
: Widget(group) | |||
{ | |||
@@ -77,3 +81,7 @@ bool DemoWidgetClickable::onMouse(const MouseEvent& event) | |||
return Widget::onMouse(event); | |||
} | |||
// ----------------------------------------------------------------------- | |||
END_NAMESPACE_DGL |
@@ -16,6 +16,10 @@ | |||
#include "Widget.hpp" | |||
START_NAMESPACE_DGL | |||
// ----------------------------------------------------------------------- | |||
class DemoWidgetClickable : public Widget | |||
{ | |||
public: | |||
@@ -26,3 +30,9 @@ public: | |||
private: | |||
unsigned fColorId = 0; | |||
}; | |||
// ----------------------------------------------------------------------- | |||
END_NAMESPACE_DGL | |||
using DGL_NAMESPACE::DemoWidgetClickable; |
@@ -35,7 +35,7 @@ TARGETS += jack | |||
endif | |||
endif | |||
ifeq ($(LINUX),true) | |||
ifneq ($(MACOS_OR_WINDOWS),true) | |||
ifeq ($(HAVE_CAIRO),true) | |||
ifeq ($(HAVE_LIBLO),true) | |||
TARGETS += dssi | |||
@@ -21,9 +21,12 @@ FILES_UI = \ | |||
# -------------------------------------------------------------- | |||
# Do some magic | |||
UI_TYPE = external | |||
include ../../Makefile.plugins.mk | |||
ifneq ($(HAIKU),true) | |||
LINK_FLAGS += -ldl | |||
endif | |||
# -------------------------------------------------------------- | |||
# Enable all possible plugin types | |||
@@ -29,6 +29,10 @@ | |||
#define DISTRHO_UI_USER_RESIZABLE 1 | |||
#define DISTRHO_UI_USE_NANOVG 1 | |||
#ifdef __MOD_DEVICES__ | |||
#define DISTRHO_PLUGIN_USES_MODGUI 1 | |||
#endif | |||
enum Parameters { | |||
kParameterBufferSize = 0, | |||
kParameterTimePlaying, | |||
@@ -0,0 +1,42 @@ | |||
@prefix lv2: <http://lv2plug.in/ns/lv2core#> . | |||
@prefix mod: <http://moddevices.com/ns/mod#> . | |||
@prefix modgui: <http://moddevices.com/ns/modgui#> . | |||
<http://distrho.sf.net/examples/Info> | |||
mod:brand "DISTRHO" ; | |||
mod:label "Info" ; | |||
modgui:gui [ | |||
modgui:brand "DISTRHO" ; | |||
modgui:label "Info" ; | |||
modgui:resourcesDirectory <modgui> ; | |||
modgui:iconTemplate <modgui/icon-info.html> ; | |||
modgui:stylesheet <modgui/stylesheet-info.css> ; | |||
modgui:screenshot <modgui/screenshot-info.png> ; | |||
modgui:thumbnail <modgui/thumbnail-info.png> ; | |||
modgui:javascript <modgui/script-info.js> ; | |||
modgui:monitoredOutputs [ | |||
lv2:symbol "buffer_size" ; | |||
] , [ | |||
lv2:symbol "time_playing" ; | |||
] , [ | |||
lv2:symbol "time_frame" ; | |||
] , [ | |||
lv2:symbol "time_validbbt" ; | |||
] , [ | |||
lv2:symbol "time_bar" ; | |||
] , [ | |||
lv2:symbol "time_beat" ; | |||
] , [ | |||
lv2:symbol "time_tick" ; | |||
] , [ | |||
lv2:symbol "time_barstarttick" ; | |||
] , [ | |||
lv2:symbol "time_beatsperbar" ; | |||
] , [ | |||
lv2:symbol "time_beattype" ; | |||
] , [ | |||
lv2:symbol "time_ticksperbeat" ; | |||
] , [ | |||
lv2:symbol "time_beatsperminute" ; | |||
] ; | |||
] . |
@@ -0,0 +1,73 @@ | |||
<div class="mod-pedal distrho-info{{{cns}}}"> | |||
<div mod-role="drag-handle" class="mod-drag-handle"></div> | |||
<div class="tables clearfix"> | |||
<div class="table-left"> | |||
<table> | |||
<tr> | |||
<td>Buffer Size:</td> | |||
<td mod-role="buffer_size">---</td> | |||
</tr> | |||
<tr> | |||
<td>Sample Rate:</td> | |||
<td mod-role="sample_rate">---</td> | |||
</tr> | |||
<tr> | |||
<td>Playing:</td> | |||
<td mod-role="time_playing">---</td> | |||
</tr> | |||
<tr> | |||
<td>Frame:</td> | |||
<td mod-role="time_frame">---</td> | |||
</tr> | |||
<tr> | |||
<td>Time:</td> | |||
<td mod-role="time_frame_s">---</td> | |||
</tr> | |||
</table> | |||
</div> | |||
<div class="table-right"> | |||
<table> | |||
<tr> | |||
<td>BBT Valid:</td> | |||
<td mod-role="time_validbbt">---</td> | |||
</tr> | |||
<tr> | |||
<td>Bar:</td> | |||
<td mod-role="time_bar">---</td> | |||
</tr> | |||
<tr> | |||
<td>Beat:</td> | |||
<td mod-role="time_beat">---</td> | |||
</tr> | |||
<tr> | |||
<td>Tick:</td> | |||
<td mod-role="time_tick">---</td> | |||
</tr> | |||
<tr> | |||
<td>Bar Start Tick:</td> | |||
<td mod-role="time_barstarttick">---</td> | |||
</tr> | |||
<tr> | |||
<td>Beats Per Bar:</td> | |||
<td mod-role="time_beatsperbar">---</td> | |||
</tr> | |||
<tr> | |||
<td>Beat Type:</td> | |||
<td mod-role="time_beattype">---</td> | |||
</tr> | |||
<tr> | |||
<td>Ticks Per Beat:</td> | |||
<td mod-role="time_ticksperbeat">---</td> | |||
</tr> | |||
<tr> | |||
<td>BPM:</td> | |||
<td mod-role="time_beatsperminute">---</td> | |||
</tr> | |||
</table> | |||
</div> | |||
</div> | |||
<div class="mod-logo"></div> | |||
<div class="mod-magic"></div> | |||
</div> |
@@ -0,0 +1,57 @@ | |||
function (event) { | |||
function magic () { | |||
if (event.data.magicHasHappened) { | |||
$('#pedalboard-dashboard').css({ | |||
'background': "#111 url(/img/background.jpg) repeat", | |||
}); | |||
} else { | |||
$('#pedalboard-dashboard').css({ | |||
'background': "#111 url(/resources/tilesf1.jpg?uri=http%3A//distrho.sf.net/examples/Info) repeat", | |||
}); | |||
} | |||
event.data.magicHasHappened = !event.data.magicHasHappened; | |||
} | |||
function handle_event (symbol, value) { | |||
switch (symbol) { | |||
case 'time_playing': | |||
case 'time_validbbt': | |||
value = value > 0.5 ? "Yes" : "No"; | |||
break; | |||
case 'time_beatsperminute': | |||
value = value.toFixed(2); | |||
break; | |||
case 'time_frame': { | |||
var time = value / SAMPLERATE; | |||
var secs = time % 60; | |||
var mins = (time / 60) % 60; | |||
var hrs = (time / 3600) % 60; | |||
event.icon.find('[mod-role=time_frame_s]').text(sprintf("%02d:%02d:%02d", hrs, mins, secs)); | |||
// fall-through | |||
} | |||
default: | |||
value = value.toFixed(); | |||
break; | |||
} | |||
event.icon.find('[mod-role='+symbol+']').text(value); | |||
} | |||
if (event.type == 'start') { | |||
var ports = event.ports; | |||
for (var p in ports) { | |||
if (ports[p].symbol[0] == ":") { | |||
continue; | |||
} | |||
handle_event (ports[p].symbol, ports[p].value); | |||
} | |||
// special cases | |||
event.icon.find ('[mod-role=sample_rate]').text(SAMPLERATE); | |||
event.icon.find ('.mod-magic').click(magic); | |||
} | |||
else if (event.type == 'change') { | |||
handle_event (event.symbol, event.value); | |||
} | |||
} |
@@ -0,0 +1,88 @@ | |||
@import url(/fonts/nexa/stylesheet.css); | |||
@import url(/fonts/questrial/stylesheet.css); | |||
.distrho-info{{{cns}}} { | |||
background-image:url(/resources/box.png{{{ns}}}); | |||
background-position:center center; | |||
background-repeat:no-repeat; | |||
background-size:600px 300px; | |||
width:600px; | |||
height:300px; | |||
/* position:absolute; */ | |||
border-radius: 21px; | |||
/* font-size: 2rem !important; */ | |||
} | |||
.distrho-info{{{cns}}} .mod-pedal-input.mono, | |||
.distrho-info{{{cns}}} .mod-pedal-output.mono { | |||
top: 60px !important; | |||
} | |||
.distrho-info{{{cns}}} .mod-pedal-input.stereo, | |||
.distrho-info{{{cns}}} .mod-pedal-output.stereo { | |||
top: 15px !important; | |||
} | |||
.distrho-info{{{cns}}} .mod-logo { | |||
background: url(/img/watermark.png) 42px 146px no-repeat; | |||
width: 100%; | |||
height: 100%; | |||
position: absolute; | |||
top: 0px; | |||
left: 0px; | |||
} | |||
@keyframes mod-magic{{{cns}}} { | |||
0% { | |||
opacity: 0.1; | |||
} | |||
100% { | |||
opacity: 0.75; | |||
} | |||
} | |||
.distrho-info{{{cns}}} .mod-magic { | |||
background: url(/img/social/favicon.png) no-repeat; | |||
width: 118px; | |||
height: 118px; | |||
position: absolute; | |||
top: 158px; | |||
left: 52px; | |||
background-size: cover; | |||
opacity: 0; | |||
cursor: pointer; | |||
z-index: 21; | |||
animation: mod-magic{{{cns}}} 5s infinite; | |||
animation-direction: alternate; | |||
animation-timing-function: ease-in; | |||
} | |||
.distrho-info{{{cns}}} .tables { | |||
display: flex; | |||
flex-direction: row; | |||
height: 100%; | |||
padding: 21px; | |||
font-family: monospace; | |||
font-size: 1.8rem; | |||
font-weight: bold; | |||
} | |||
.distrho-info{{{cns}}} .table-left, | |||
.distrho-info{{{cns}}} .table-right { | |||
width: 50%; | |||
} | |||
.distrho-info{{{cns}}} .table-left { | |||
padding-left: 36px; | |||
} | |||
.distrho-info{{{cns}}} table { | |||
border-collapse: separate; | |||
border-spacing: 6px 1px; | |||
} | |||
.distrho-info{{{cns}}} tr > td:first-child { | |||
text-align: right; | |||
} | |||
.distrho-info{{{cns}}} tr > td:last-child { | |||
font-weight: lighter; | |||
} |
@@ -0,0 +1,4 @@ | |||
From http://www.myfreetextures.com/generated-seamless-tile-background-texture/ | |||
Fair Use – You can use the images with credit / attribution to www.myfreetextures.com. | |||
Sometimes it is not possible to give credit directly on a final project – in these cases please mention the site on your website, facebook or similar, whatever you think is fair. |
@@ -23,7 +23,7 @@ include ../../Makefile.plugins.mk | |||
# -------------------------------------------------------------- | |||
# Enable all possible plugin types | |||
ifeq ($(LINUX),true) | |||
ifneq ($(MACOS_OR_WINDOWS),true) | |||
TARGETS += ladspa | |||
TARGETS += dssi | |||
endif | |||
@@ -21,7 +21,7 @@ START_NAMESPACE_DISTRHO | |||
/** | |||
We need the Color class from DGL. | |||
*/ | |||
using DGL::Color; | |||
using DGL_NAMESPACE::Color; | |||
/** | |||
Smooth meters a bit. | |||
@@ -32,7 +32,7 @@ TARGETS += jack | |||
endif | |||
endif | |||
ifeq ($(LINUX),true) | |||
ifneq ($(MACOS_OR_WINDOWS),true) | |||
ifeq ($(HAVE_LIBLO),true) | |||
ifeq ($(HAVE_OPENGL),true) | |||
TARGETS += dssi | |||
@@ -21,7 +21,7 @@ START_NAMESPACE_DISTRHO | |||
/** | |||
We need the rectangle class from DGL. | |||
*/ | |||
using DGL::Rectangle; | |||
using DGL_NAMESPACE::Rectangle; | |||
// ----------------------------------------------------------------------------------------------------------- | |||
@@ -32,7 +32,7 @@ TARGETS += jack | |||
endif | |||
endif | |||
ifeq ($(LINUX),true) | |||
ifneq ($(MACOS_OR_WINDOWS),true) | |||
ifeq ($(HAVE_LIBLO),true) | |||
ifeq ($(HAVE_OPENGL),true) | |||
TARGETS += ladspa | |||
@@ -18,6 +18,11 @@ | |||
START_NAMESPACE_DISTRHO | |||
/** | |||
We need the rectangle class from DGL. | |||
*/ | |||
using DGL_NAMESPACE::Rectangle; | |||
// ----------------------------------------------------------------------------------------------------------- | |||
class ExampleUIParameters : public UI | |||
@@ -32,7 +32,7 @@ TARGETS += jack | |||
endif | |||
endif | |||
ifeq ($(LINUX),true) | |||
ifneq ($(MACOS_OR_WINDOWS),true) | |||
ifeq ($(HAVE_LIBLO),true) | |||
ifeq ($(HAVE_OPENGL),true) | |||
TARGETS += dssi | |||
@@ -1,19 +1,29 @@ | |||
#!/usr/bin/makefile -f | |||
include ../../Makefile.base.mk | |||
all: build | |||
ifeq ($(WINDOWS),true) | |||
build: ../lv2_ttl_generator.exe | |||
else | |||
build: ../lv2_ttl_generator | |||
endif | |||
../lv2_ttl_generator: lv2_ttl_generator.c | |||
$(CC) $< $(CFLAGS) -o $@ $(LDFLAGS) -ldl | |||
build: ../lv2_ttl_generator.exe | |||
../lv2_ttl_generator.exe: lv2_ttl_generator.c | |||
$(CC) $< $(CFLAGS) -o $@ $(LDFLAGS) -static | |||
touch ../lv2_ttl_generator | |||
else # WINDOWS | |||
ifneq ($(HAIKU),true) | |||
LDFLAGS += -ldl | |||
endif | |||
build: ../lv2_ttl_generator | |||
../lv2_ttl_generator: lv2_ttl_generator.c | |||
$(CC) $< $(CFLAGS) -o $@ $(LDFLAGS) | |||
endif # WINDOWS | |||
clean: | |||
rm -f ../lv2_ttl_generator ../lv2_ttl_generator.exe |