@@ -5,6 +5,7 @@ set -e | |||||
sudo apt-get install -y \ | sudo apt-get install -y \ | ||||
g++ \ | g++ \ | ||||
pkg-config \ | pkg-config \ | ||||
libcairo2-dev \ | |||||
libjack-jackd2-dev \ | libjack-jackd2-dev \ | ||||
liblo-dev \ | liblo-dev \ | ||||
libgl1-mesa-dev \ | libgl1-mesa-dev \ | ||||
@@ -7,8 +7,14 @@ _FLAGS="-Werror" | |||||
export CFLAGS="${_FLAGS}" | export CFLAGS="${_FLAGS}" | ||||
export CXXFLAGS="${_FLAGS}" | export CXXFLAGS="${_FLAGS}" | ||||
# Start clean | |||||
echo "==============> Normal build" | |||||
make clean >/dev/null | make clean >/dev/null | ||||
# Build now | |||||
make | 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 | make clean >/dev/null | ||||
# Build now | # Build now | ||||
make | |||||
make HAVE_CAIRO=false HAVE_JACK=false |
@@ -17,4 +17,4 @@ export CROSS_COMPILING=true | |||||
make clean >/dev/null | make clean >/dev/null | ||||
# Build now | # Build now | ||||
make | |||||
make HAVE_CAIRO=false HAVE_JACK=false |
@@ -11,6 +11,8 @@ CXX ?= g++ | |||||
# --------------------------------------------------------------------------------------------------------------------- | # --------------------------------------------------------------------------------------------------------------------- | ||||
# Auto-detect OS if not defined | # Auto-detect OS if not defined | ||||
TARGET_MACHINE := $(shell $(CC) -dumpmachine) | |||||
ifneq ($(BSD),true) | ifneq ($(BSD),true) | ||||
ifneq ($(HAIKU),true) | ifneq ($(HAIKU),true) | ||||
ifneq ($(HURD),true) | ifneq ($(HURD),true) | ||||
@@ -18,7 +20,6 @@ ifneq ($(LINUX),true) | |||||
ifneq ($(MACOS),true) | ifneq ($(MACOS),true) | ||||
ifneq ($(WINDOWS),true) | ifneq ($(WINDOWS),true) | ||||
TARGET_MACHINE := $(shell $(CC) -dumpmachine) | |||||
ifneq (,$(findstring bsd,$(TARGET_MACHINE))) | ifneq (,$(findstring bsd,$(TARGET_MACHINE))) | ||||
BSD=true | BSD=true | ||||
endif | endif | ||||
@@ -45,6 +46,28 @@ endif | |||||
endif | 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) | # Set PKG_CONFIG (can be overridden by environment variable) | ||||
@@ -106,7 +129,15 @@ endif | |||||
# Set build and link flags | # Set build and link flags | ||||
BASE_FLAGS = -Wall -Wextra -pipe -MD -MP | 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) | ifeq ($(MACOS),true) | ||||
# MacOS linker flags | # MacOS linker flags | ||||
@@ -208,18 +239,22 @@ HAVE_LIBLO = $(shell $(PKG_CONFIG) --exists liblo && echo true) | |||||
# --------------------------------------------------------------------------------------------------------------------- | # --------------------------------------------------------------------------------------------------------------------- | ||||
# Set Generic DGL stuff | # Set Generic DGL stuff | ||||
ifeq ($(HAIKU),true) | |||||
DGL_SYSTEM_LIBS += -lbe | |||||
endif | |||||
ifeq ($(MACOS),true) | ifeq ($(MACOS),true) | ||||
DGL_SYSTEM_LIBS += -framework Cocoa | |||||
DGL_SYSTEM_LIBS += -framework Cocoa | |||||
endif | endif | ||||
ifeq ($(WINDOWS),true) | ifeq ($(WINDOWS),true) | ||||
DGL_SYSTEM_LIBS += -lgdi32 -lcomdlg32 | |||||
DGL_SYSTEM_LIBS += -lgdi32 -lcomdlg32 | |||||
endif | endif | ||||
ifneq ($(HAIKU_OR_MACOS_OR_WINDOWS),true) | ifneq ($(HAIKU_OR_MACOS_OR_WINDOWS),true) | ||||
ifeq ($(HAVE_X11),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 | ||||
endif | endif | ||||
@@ -244,6 +279,11 @@ ifeq ($(HAVE_OPENGL),true) | |||||
DGL_FLAGS += -DHAVE_OPENGL | 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) | ifeq ($(MACOS),true) | ||||
OPENGL_LIBS = -framework OpenGL | OPENGL_LIBS = -framework OpenGL | ||||
endif | endif | ||||
@@ -252,7 +292,7 @@ ifeq ($(WINDOWS),true) | |||||
OPENGL_LIBS = -lopengl32 | OPENGL_LIBS = -lopengl32 | ||||
endif | endif | ||||
ifneq ($(MACOS_OR_WINDOWS),true) | |||||
ifneq ($(HAIKU_OR_MACOS_OR_WINDOWS),true) | |||||
OPENGL_FLAGS = $(shell $(PKG_CONFIG) --cflags gl x11) | OPENGL_FLAGS = $(shell $(PKG_CONFIG) --cflags gl x11) | ||||
OPENGL_LIBS = $(shell $(PKG_CONFIG) --libs gl x11) | OPENGL_LIBS = $(shell $(PKG_CONFIG) --libs gl x11) | ||||
endif | endif | ||||
@@ -291,3 +331,12 @@ SHARED = -shared | |||||
endif | endif | ||||
# --------------------------------------------------------------------------------------------------------------------- | # --------------------------------------------------------------------------------------------------------------------- | ||||
# Handle the verbosity switch | |||||
ifeq ($(VERBOSE),true) | |||||
SILENT = | |||||
else | |||||
SILENT = @ | |||||
endif | |||||
# --------------------------------------------------------------------------------------------------------------------- |
@@ -70,8 +70,9 @@ UI_TYPE = opengl | |||||
endif | endif | ||||
ifeq ($(UI_TYPE),cairo) | ifeq ($(UI_TYPE),cairo) | ||||
DGL_FLAGS += -DDGL_CAIRO | |||||
ifeq ($(HAVE_CAIRO),true) | ifeq ($(HAVE_CAIRO),true) | ||||
DGL_FLAGS += $(CAIRO_FLAGS) -DDGL_CAIRO | |||||
DGL_FLAGS += $(CAIRO_FLAGS) | |||||
DGL_LIBS += $(CAIRO_LIBS) | DGL_LIBS += $(CAIRO_LIBS) | ||||
DGL_LIB = $(DPF_PATH)/build/libdgl-cairo.a | DGL_LIB = $(DPF_PATH)/build/libdgl-cairo.a | ||||
HAVE_DGL = true | HAVE_DGL = true | ||||
@@ -81,8 +82,9 @@ endif | |||||
endif | endif | ||||
ifeq ($(UI_TYPE),opengl) | ifeq ($(UI_TYPE),opengl) | ||||
DGL_FLAGS += -DDGL_OPENGL | |||||
ifeq ($(HAVE_OPENGL),true) | ifeq ($(HAVE_OPENGL),true) | ||||
DGL_FLAGS += $(OPENGL_FLAGS) -DDGL_OPENGL | |||||
DGL_FLAGS += $(OPENGL_FLAGS) | |||||
DGL_LIBS += $(OPENGL_LIBS) | DGL_LIBS += $(OPENGL_LIBS) | ||||
DGL_LIB = $(DPF_PATH)/build/libdgl-opengl.a | DGL_LIB = $(DPF_PATH)/build/libdgl-opengl.a | ||||
HAVE_DGL = true | HAVE_DGL = true | ||||
@@ -91,6 +93,11 @@ HAVE_DGL = false | |||||
endif | endif | ||||
endif | endif | ||||
ifeq ($(UI_TYPE),external) | |||||
DGL_FLAGS += -DDGL_EXTERNAL | |||||
HAVE_DGL = true | |||||
endif | |||||
DGL_LIBS += $(DGL_SYSTEM_LIBS) | DGL_LIBS += $(DGL_SYSTEM_LIBS) | ||||
ifneq ($(HAVE_DGL),true) | ifneq ($(HAVE_DGL),true) | ||||
@@ -114,17 +121,17 @@ all: | |||||
$(BUILD_DIR)/%.c.o: %.c | $(BUILD_DIR)/%.c.o: %.c | ||||
-@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | -@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | ||||
@echo "Compiling $<" | @echo "Compiling $<" | ||||
@$(CC) $< $(BUILD_C_FLAGS) -c -o $@ | |||||
$(SILENT)$(CC) $< $(BUILD_C_FLAGS) -c -o $@ | |||||
$(BUILD_DIR)/%.cc.o: %.cc | $(BUILD_DIR)/%.cc.o: %.cc | ||||
-@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | -@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | ||||
@echo "Compiling $<" | @echo "Compiling $<" | ||||
@$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||||
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||||
$(BUILD_DIR)/%.cpp.o: %.cpp | $(BUILD_DIR)/%.cpp.o: %.cpp | ||||
-@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | -@mkdir -p "$(shell dirname $(BUILD_DIR)/$<)" | ||||
@echo "Compiling $<" | @echo "Compiling $<" | ||||
@$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||||
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||||
clean: | clean: | ||||
rm -rf $(BUILD_DIR) | rm -rf $(BUILD_DIR) | ||||
@@ -135,22 +142,22 @@ clean: | |||||
$(BUILD_DIR)/DistrhoPluginMain_%.cpp.o: $(DPF_PATH)/distrho/DistrhoPluginMain.cpp | $(BUILD_DIR)/DistrhoPluginMain_%.cpp.o: $(DPF_PATH)/distrho/DistrhoPluginMain.cpp | ||||
-@mkdir -p $(BUILD_DIR) | -@mkdir -p $(BUILD_DIR) | ||||
@echo "Compiling DistrhoPluginMain.cpp ($*)" | @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 | $(BUILD_DIR)/DistrhoUIMain_%.cpp.o: $(DPF_PATH)/distrho/DistrhoUIMain.cpp | ||||
-@mkdir -p $(BUILD_DIR) | -@mkdir -p $(BUILD_DIR) | ||||
@echo "Compiling DistrhoUIMain.cpp ($*)" | @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 | $(BUILD_DIR)/DistrhoPluginMain_JACK.cpp.o: $(DPF_PATH)/distrho/DistrhoPluginMain.cpp | ||||
-@mkdir -p $(BUILD_DIR) | -@mkdir -p $(BUILD_DIR) | ||||
@echo "Compiling DistrhoPluginMain.cpp (JACK)" | @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 | $(BUILD_DIR)/DistrhoUIMain_DSSI.cpp.o: $(DPF_PATH)/distrho/DistrhoUIMain.cpp | ||||
-@mkdir -p $(BUILD_DIR) | -@mkdir -p $(BUILD_DIR) | ||||
@echo "Compiling DistrhoUIMain.cpp (DSSI)" | @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 | # JACK | ||||
@@ -164,7 +171,7 @@ $(jack): $(OBJS_DSP) $(BUILD_DIR)/DistrhoPluginMain_JACK.cpp.o | |||||
endif | endif | ||||
-@mkdir -p $(shell dirname $@) | -@mkdir -p $(shell dirname $@) | ||||
@echo "Creating JACK standalone for $(NAME)" | @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 | # LADSPA | ||||
@@ -174,7 +181,7 @@ ladspa: $(ladspa_dsp) | |||||
$(ladspa_dsp): $(OBJS_DSP) $(BUILD_DIR)/DistrhoPluginMain_LADSPA.cpp.o | $(ladspa_dsp): $(OBJS_DSP) $(BUILD_DIR)/DistrhoPluginMain_LADSPA.cpp.o | ||||
-@mkdir -p $(shell dirname $@) | -@mkdir -p $(shell dirname $@) | ||||
@echo "Creating LADSPA plugin for $(NAME)" | @echo "Creating LADSPA plugin for $(NAME)" | ||||
@$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(SHARED) -o $@ | |||||
$(SILENT)$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(SHARED) -o $@ | |||||
# --------------------------------------------------------------------------------------------------------------------- | # --------------------------------------------------------------------------------------------------------------------- | ||||
# DSSI | # DSSI | ||||
@@ -186,12 +193,12 @@ dssi_ui: $(dssi_ui) | |||||
$(dssi_dsp): $(OBJS_DSP) $(BUILD_DIR)/DistrhoPluginMain_DSSI.cpp.o | $(dssi_dsp): $(OBJS_DSP) $(BUILD_DIR)/DistrhoPluginMain_DSSI.cpp.o | ||||
-@mkdir -p $(shell dirname $@) | -@mkdir -p $(shell dirname $@) | ||||
@echo "Creating DSSI plugin library for $(NAME)" | @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) | $(dssi_ui): $(OBJS_UI) $(BUILD_DIR)/DistrhoUIMain_DSSI.cpp.o $(DGL_LIB) | ||||
-@mkdir -p $(shell dirname $@) | -@mkdir -p $(shell dirname $@) | ||||
@echo "Creating DSSI UI for $(NAME)" | @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 | # 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) | $(lv2): $(OBJS_DSP) $(OBJS_UI) $(BUILD_DIR)/DistrhoPluginMain_LV2.cpp.o $(BUILD_DIR)/DistrhoUIMain_LV2.cpp.o $(DGL_LIB) | ||||
-@mkdir -p $(shell dirname $@) | -@mkdir -p $(shell dirname $@) | ||||
@echo "Creating LV2 plugin for $(NAME)" | @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 | $(lv2_dsp): $(OBJS_DSP) $(BUILD_DIR)/DistrhoPluginMain_LV2.cpp.o | ||||
-@mkdir -p $(shell dirname $@) | -@mkdir -p $(shell dirname $@) | ||||
@echo "Creating LV2 plugin library for $(NAME)" | @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) | $(lv2_ui): $(OBJS_UI) $(BUILD_DIR)/DistrhoUIMain_LV2.cpp.o $(DGL_LIB) | ||||
-@mkdir -p $(shell dirname $@) | -@mkdir -p $(shell dirname $@) | ||||
@echo "Creating LV2 plugin UI for $(NAME)" | @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 | # VST | ||||
@@ -227,7 +234,7 @@ $(vst): $(OBJS_DSP) $(BUILD_DIR)/DistrhoPluginMain_VST.cpp.o | |||||
endif | endif | ||||
-@mkdir -p $(shell dirname $@) | -@mkdir -p $(shell dirname $@) | ||||
@echo "Creating VST plugin for $(NAME)" | @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) | - [Rezonateur](https://github.com/jpcima/rezonateur) | ||||
- [QuadraFuzz](https://github.com/jpcima/quadrafuzz) | - [QuadraFuzz](https://github.com/jpcima/quadrafuzz) | ||||
- [Stone Phaser](https://github.com/jpcima/stone-phaser) | - [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) | - [Shiru Plugins](https://github.com/linuxmao-org/shiru-plugins) (work in progress) | ||||
- [midiomatic](https://github.com/SpotlightKid/midiomatic) (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) | - [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, | class ImageAboutWindow : public Window, | ||||
public Widget | public Widget | ||||
#else | |||||
// crash when creating or opening 2nd window | |||||
class ImageAboutWindow | |||||
#endif | |||||
{ | { | ||||
public: | public: | ||||
explicit ImageAboutWindow(Window& parent, const Image& image = Image()); | explicit ImageAboutWindow(Window& parent, const Image& image = Image()); | ||||
@@ -34,11 +39,15 @@ public: | |||||
void setImage(const Image& image); | void setImage(const Image& image); | ||||
#ifndef DISTRHO_OS_HAIKU | |||||
protected: | protected: | ||||
void onDisplay() override; | void onDisplay() override; | ||||
bool onKeyboard(const KeyboardEvent&) override; | bool onKeyboard(const KeyboardEvent&) override; | ||||
bool onMouse(const MouseEvent&) override; | bool onMouse(const MouseEvent&) override; | ||||
void onReshape(uint width, uint height) override; | void onReshape(uint width, uint height) override; | ||||
#else | |||||
void exec() {} | |||||
#endif | |||||
private: | private: | ||||
Image fImgBackground; | Image fImgBackground; | ||||
@@ -77,65 +77,65 @@ all: $(TARGETS) | |||||
../build/libdgl-cairo.a: $(OBJS_cairo) | ../build/libdgl-cairo.a: $(OBJS_cairo) | ||||
-@mkdir -p ../build | -@mkdir -p ../build | ||||
@echo "Creating libdgl-cairo.a" | @echo "Creating libdgl-cairo.a" | ||||
@rm -f $@ | |||||
@$(AR) crs $@ $^ | |||||
$(SILENT)rm -f $@ | |||||
$(SILENT)$(AR) crs $@ $^ | |||||
../build/libdgl-opengl.a: $(OBJS_opengl) | ../build/libdgl-opengl.a: $(OBJS_opengl) | ||||
-@mkdir -p ../build | -@mkdir -p ../build | ||||
@echo "Creating libdgl-opengl.a" | @echo "Creating libdgl-opengl.a" | ||||
@rm -f $@ | |||||
@$(AR) crs $@ $^ | |||||
$(SILENT)rm -f $@ | |||||
$(SILENT)$(AR) crs $@ $^ | |||||
# Compat name, to be removed soon | # Compat name, to be removed soon | ||||
../build/libdgl.a: ../build/libdgl-opengl.a | ../build/libdgl.a: ../build/libdgl-opengl.a | ||||
@echo "Symlinking libdgl.a" | @echo "Symlinking libdgl.a" | ||||
@ln -sf $< $@ | |||||
$(SILENT)ln -sf $< $@ | |||||
# --------------------------------------------------------------------------------------------------------------------- | # --------------------------------------------------------------------------------------------------------------------- | ||||
../build/dgl/%.c.o: src/%.c | ../build/dgl/%.c.o: src/%.c | ||||
-@mkdir -p ../build/dgl | -@mkdir -p ../build/dgl | ||||
@echo "Compiling $<" | @echo "Compiling $<" | ||||
@$(CC) $< $(BUILD_C_FLAGS) -c -o $@ | |||||
$(SILENT)$(CC) $< $(BUILD_C_FLAGS) -c -o $@ | |||||
../build/dgl/%.cpp.o: src/%.cpp | ../build/dgl/%.cpp.o: src/%.cpp | ||||
-@mkdir -p ../build/dgl | -@mkdir -p ../build/dgl | ||||
@echo "Compiling $<" | @echo "Compiling $<" | ||||
@$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||||
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||||
# --------------------------------------------------------------------------------------------------------------------- | # --------------------------------------------------------------------------------------------------------------------- | ||||
../build/dgl/%.cpp.cairo.o: src/%.cpp | ../build/dgl/%.cpp.cairo.o: src/%.cpp | ||||
-@mkdir -p ../build/dgl | -@mkdir -p ../build/dgl | ||||
@echo "Compiling $< (Cairo variant)" | @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/* | ../build/dgl/Window.cpp.cairo.o: src/Window.cpp src/sofd/* src/pugl/* | ||||
-@mkdir -p ../build/dgl | -@mkdir -p ../build/dgl | ||||
@echo "Compiling $< (Cairo variant)" | @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/* | ../build/dgl/Window.mm.cairo.o: src/Window.cpp src/sofd/* src/pugl/* | ||||
-@mkdir -p ../build/dgl | -@mkdir -p ../build/dgl | ||||
@echo "Compiling $< (Cairo variant)" | @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 | ../build/dgl/%.cpp.opengl.o: src/%.cpp | ||||
-@mkdir -p ../build/dgl | -@mkdir -p ../build/dgl | ||||
@echo "Compiling $< (OpenGL variant)" | @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/* | ../build/dgl/Window.cpp.opengl.o: src/Window.cpp src/sofd/* src/pugl/* | ||||
-@mkdir -p ../build/dgl | -@mkdir -p ../build/dgl | ||||
@echo "Compiling $< (OpenGL variant)" | @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/* | ../build/dgl/Window.mm.opengl.o: src/Window.cpp src/sofd/* src/pugl/* | ||||
-@mkdir -p ../build/dgl | -@mkdir -p ../build/dgl | ||||
@echo "Compiling $< (OpenGL variant)" | @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) | ImageAboutWindow::ImageAboutWindow(Window& parent, const Image& image) | ||||
: Window(parent.getApp(), parent), | : Window(parent.getApp(), parent), | ||||
Widget((Window&)*this), | Widget((Window&)*this), | ||||
@@ -44,6 +45,10 @@ ImageAboutWindow::ImageAboutWindow(Widget* widget, const Image& image) | |||||
Window::setSize(image.getSize()); | Window::setSize(image.getSize()); | ||||
Window::setTitle("About"); | 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) | void ImageAboutWindow::setImage(const Image& image) | ||||
{ | { | ||||
@@ -51,9 +56,12 @@ void ImageAboutWindow::setImage(const Image& image) | |||||
return; | return; | ||||
fImgBackground = image; | fImgBackground = image; | ||||
#ifndef DISTRHO_OS_HAIKU | |||||
Window::setSize(image.getSize()); | Window::setSize(image.getSize()); | ||||
#endif | |||||
} | } | ||||
#ifndef DISTRHO_OS_HAIKU | |||||
void ImageAboutWindow::onDisplay() | void ImageAboutWindow::onDisplay() | ||||
{ | { | ||||
fImgBackground.draw(); | fImgBackground.draw(); | ||||
@@ -86,6 +94,7 @@ void ImageAboutWindow::onReshape(uint width, uint height) | |||||
Widget::setSize(width, height); | Widget::setSize(width, height); | ||||
Window::onReshape(width, height); | Window::onReshape(width, height); | ||||
} | } | ||||
#endif | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
@@ -37,14 +37,17 @@ | |||||
# pragma GCC diagnostic ignored "-Wimplicit-fallthrough" | # pragma GCC diagnostic ignored "-Wimplicit-fallthrough" | ||||
#endif | #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) | #elif defined(DISTRHO_OS_MAC) | ||||
# define PuglWindow DISTRHO_JOIN_MACRO(PuglWindow, DGL_NAMESPACE) | # define PuglWindow DISTRHO_JOIN_MACRO(PuglWindow, DGL_NAMESPACE) | ||||
# define PuglOpenGLView DISTRHO_JOIN_MACRO(PuglOpenGLView, DGL_NAMESPACE) | # define PuglOpenGLView DISTRHO_JOIN_MACRO(PuglOpenGLView, DGL_NAMESPACE) | ||||
# include "pugl/pugl_osx.m" | # include "pugl/pugl_osx.m" | ||||
#elif defined(DISTRHO_OS_WINDOWS) | |||||
# include "pugl/pugl_win.cpp" | |||||
# undef max | |||||
# undef min | |||||
#else | #else | ||||
# include <sys/types.h> | # include <sys/types.h> | ||||
# include <unistd.h> | # include <unistd.h> | ||||
@@ -99,9 +102,10 @@ struct Window::PrivateData { | |||||
fTitle(nullptr), | fTitle(nullptr), | ||||
fWidgets(), | fWidgets(), | ||||
fModal(), | 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) | #elif defined(DISTRHO_OS_MAC) | ||||
fNeedsIdle(true), | fNeedsIdle(true), | ||||
mView(nullptr), | mView(nullptr), | ||||
@@ -111,6 +115,9 @@ struct Window::PrivateData { | |||||
, fOpenFilePanel(nullptr), | , fOpenFilePanel(nullptr), | ||||
fFilePanelDelegate(nullptr) | fFilePanelDelegate(nullptr) | ||||
# endif | # endif | ||||
#elif defined(DISTRHO_OS_WINDOWS) | |||||
hwnd(nullptr), | |||||
hwndParent(nullptr) | |||||
#else | #else | ||||
xDisplay(nullptr), | xDisplay(nullptr), | ||||
xWindow(0) | xWindow(0) | ||||
@@ -135,9 +142,10 @@ struct Window::PrivateData { | |||||
fTitle(nullptr), | fTitle(nullptr), | ||||
fWidgets(), | fWidgets(), | ||||
fModal(parent.pData), | 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) | #elif defined(DISTRHO_OS_MAC) | ||||
fNeedsIdle(false), | fNeedsIdle(false), | ||||
mView(nullptr), | mView(nullptr), | ||||
@@ -147,6 +155,9 @@ struct Window::PrivateData { | |||||
, fOpenFilePanel(nullptr), | , fOpenFilePanel(nullptr), | ||||
fFilePanelDelegate(nullptr) | fFilePanelDelegate(nullptr) | ||||
# endif | # endif | ||||
#elif defined(DISTRHO_OS_WINDOWS) | |||||
hwnd(nullptr), | |||||
hwndParent(nullptr) | |||||
#else | #else | ||||
xDisplay(nullptr), | xDisplay(nullptr), | ||||
xWindow(0) | xWindow(0) | ||||
@@ -158,11 +169,13 @@ struct Window::PrivateData { | |||||
const PuglInternals* const parentImpl(parent.pData->fView->impl); | const PuglInternals* const parentImpl(parent.pData->fView->impl); | ||||
// NOTE: almost a 1:1 copy of setTransientWinId() | // 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) | #elif defined(DISTRHO_OS_MAC) | ||||
mParentWindow = parentImpl->window; | mParentWindow = parentImpl->window; | ||||
#elif defined(DISTRHO_OS_WINDOWS) | |||||
hwndParent = parentImpl->hwnd; | |||||
SetWindowLongPtr(hwnd, GWLP_HWNDPARENT, (LONG_PTR)hwndParent); | |||||
#else | #else | ||||
XSetTransientForHint(xDisplay, xWindow, parentImpl->win); | XSetTransientForHint(xDisplay, xWindow, parentImpl->win); | ||||
#endif | #endif | ||||
@@ -183,9 +196,10 @@ struct Window::PrivateData { | |||||
fTitle(nullptr), | fTitle(nullptr), | ||||
fWidgets(), | fWidgets(), | ||||
fModal(), | 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) | #elif defined(DISTRHO_OS_MAC) | ||||
fNeedsIdle(parentId == 0), | fNeedsIdle(parentId == 0), | ||||
mView(nullptr), | mView(nullptr), | ||||
@@ -195,6 +209,9 @@ struct Window::PrivateData { | |||||
, fOpenFilePanel(nullptr), | , fOpenFilePanel(nullptr), | ||||
fFilePanelDelegate(nullptr) | fFilePanelDelegate(nullptr) | ||||
# endif | # endif | ||||
#elif defined(DISTRHO_OS_WINDOWS) | |||||
hwnd(nullptr), | |||||
hwndParent(nullptr) | |||||
#else | #else | ||||
xDisplay(nullptr), | xDisplay(nullptr), | ||||
xWindow(0) | xWindow(0) | ||||
@@ -249,9 +266,10 @@ struct Window::PrivateData { | |||||
PuglInternals* impl = fView->impl; | 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) | #elif defined(DISTRHO_OS_MAC) | ||||
mView = impl->view; | mView = impl->view; | ||||
mWindow = impl->window; | mWindow = impl->window; | ||||
@@ -261,6 +279,9 @@ struct Window::PrivateData { | |||||
} else { | } else { | ||||
DISTRHO_SAFE_ASSERT(mWindow != nullptr); | DISTRHO_SAFE_ASSERT(mWindow != nullptr); | ||||
} | } | ||||
#elif defined(DISTRHO_OS_WINDOWS) | |||||
hwnd = impl->hwnd; | |||||
DISTRHO_SAFE_ASSERT(hwnd != 0); | |||||
#else | #else | ||||
xDisplay = impl->display; | xDisplay = impl->display; | ||||
xWindow = impl->win; | xWindow = impl->win; | ||||
@@ -281,7 +302,6 @@ struct Window::PrivateData { | |||||
XInternAtom(xDisplay, "_NET_WM_WINDOW_TYPE_NORMAL", False) | XInternAtom(xDisplay, "_NET_WM_WINDOW_TYPE_NORMAL", False) | ||||
}; | }; | ||||
XChangeProperty(xDisplay, xWindow, _wt, XA_ATOM, 32, PropModeReplace, (const uchar*)&_wts, 2); | XChangeProperty(xDisplay, xWindow, _wt, XA_ATOM, 32, PropModeReplace, (const uchar*)&_wts, 2); | ||||
} | } | ||||
#endif | #endif | ||||
puglEnterContext(fView); | puglEnterContext(fView); | ||||
@@ -327,11 +347,15 @@ struct Window::PrivateData { | |||||
fTitle = nullptr; | 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) | #elif defined(DISTRHO_OS_MAC) | ||||
mView = nullptr; | mView = nullptr; | ||||
mWindow = nullptr; | mWindow = nullptr; | ||||
#elif defined(DISTRHO_OS_WINDOWS) | |||||
hwnd = 0; | |||||
#else | #else | ||||
xDisplay = nullptr; | xDisplay = nullptr; | ||||
xWindow = 0; | xWindow = 0; | ||||
@@ -419,10 +443,12 @@ struct Window::PrivateData { | |||||
// the mouse position probably changed since the modal appeared, | // the mouse position probably changed since the modal appeared, | ||||
// so send a mouse motion event to the modal's parent window | // so send a mouse motion event to the modal's parent window | ||||
#if defined(DISTRHO_OS_WINDOWS) | |||||
#if defined(DISTRHO_OS_HAIKU) | |||||
// TODO | // TODO | ||||
#elif defined(DISTRHO_OS_MAC) | #elif defined(DISTRHO_OS_MAC) | ||||
// TODO | // TODO | ||||
#elif defined(DISTRHO_OS_WINDOWS) | |||||
// TODO | |||||
#else | #else | ||||
int i, wx, wy; | int i, wx, wy; | ||||
uint u; | uint u; | ||||
@@ -440,13 +466,26 @@ struct Window::PrivateData { | |||||
void focus() | void focus() | ||||
{ | { | ||||
DBG("Window focus\n"); | 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) | #elif defined(DISTRHO_OS_MAC) | ||||
if (mWindow != nullptr) | if (mWindow != nullptr) | ||||
[mWindow makeKeyWindow]; | [mWindow makeKeyWindow]; | ||||
#elif defined(DISTRHO_OS_WINDOWS) | |||||
SetForegroundWindow(hwnd); | |||||
SetActiveWindow(hwnd); | |||||
SetFocus(hwnd); | |||||
#else | #else | ||||
XRaiseWindow(xDisplay, xWindow); | XRaiseWindow(xDisplay, xWindow); | ||||
XSetInputFocus(xDisplay, xWindow, RevertToPointerRoot, CurrentTime); | XSetInputFocus(xDisplay, xWindow, RevertToPointerRoot, CurrentTime); | ||||
@@ -476,38 +515,28 @@ struct Window::PrivateData { | |||||
if (yesNo && fFirstInit) | if (yesNo && fFirstInit) | ||||
setSize(fWidth, fHeight, true); | 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 | else | ||||
{ | |||||
ShowWindow(hwnd, SW_SHOWNORMAL); | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
ShowWindow(hwnd, SW_RESTORE); | |||||
bWindow->Hide(); | |||||
// TODO use flush? | |||||
bWindow->Sync(); | |||||
bWindow->UnlockLooper(); | |||||
} | } | ||||
} | } | ||||
else | else | ||||
{ | { | ||||
ShowWindow(hwnd, SW_HIDE); | |||||
if (yesNo) | |||||
bView->Show(); | |||||
else | |||||
bView->Hide(); | |||||
} | } | ||||
UpdateWindow(hwnd); | |||||
#elif defined(DISTRHO_OS_MAC) | #elif defined(DISTRHO_OS_MAC) | ||||
if (yesNo) | if (yesNo) | ||||
{ | { | ||||
@@ -538,6 +567,38 @@ struct Window::PrivateData { | |||||
[mView setHidden:YES]; | [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 | #else | ||||
if (yesNo) | if (yesNo) | ||||
XMapRaised(xDisplay, xWindow); | XMapRaised(xDisplay, xWindow); | ||||
@@ -579,13 +640,18 @@ struct Window::PrivateData { | |||||
fResizable = yesNo; | fResizable = yesNo; | ||||
fView->user_resizable = 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 | const int winFlags = fResizable ? GetWindowLong(hwnd, GWL_STYLE) | WS_SIZEBOX | ||||
: GetWindowLong(hwnd, GWL_STYLE) & ~WS_SIZEBOX; | : GetWindowLong(hwnd, GWL_STYLE) & ~WS_SIZEBOX; | ||||
SetWindowLong(hwnd, GWL_STYLE, winFlags); | SetWindowLong(hwnd, GWL_STYLE, winFlags); | ||||
#elif defined(DISTRHO_OS_MAC) | |||||
const uint flags(yesNo ? (NSViewWidthSizable|NSViewHeightSizable) : 0x0); | |||||
[mView setAutoresizingMask:flags]; | |||||
#endif | #endif | ||||
setSize(fWidth, fHeight, true); | 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"); | 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) | #elif defined(DISTRHO_OS_MAC) | ||||
[mView setFrame:NSMakeRect(0, 0, width, height)]; | [mView setFrame:NSMakeRect(0, 0, width, height)]; | ||||
@@ -655,6 +725,16 @@ struct Window::PrivateData { | |||||
[[mWindow standardWindowButton:NSWindowZoomButton] setHidden:YES]; | [[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 | #else | ||||
if (! fResizable) | if (! fResizable) | ||||
@@ -700,8 +780,12 @@ struct Window::PrivateData { | |||||
fTitle = strdup(title); | 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) | #elif defined(DISTRHO_OS_MAC) | ||||
if (mWindow != nullptr) | if (mWindow != nullptr) | ||||
{ | { | ||||
@@ -712,6 +796,8 @@ struct Window::PrivateData { | |||||
[mWindow setTitle:titleString]; | [mWindow setTitle:titleString]; | ||||
} | } | ||||
#elif defined(DISTRHO_OS_WINDOWS) | |||||
SetWindowTextA(hwnd, title); | |||||
#else | #else | ||||
XStoreName(xDisplay, xWindow, title); | XStoreName(xDisplay, xWindow, title); | ||||
Atom netWmName = XInternAtom(xDisplay, "_NET_WM_NAME", False); | Atom netWmName = XInternAtom(xDisplay, "_NET_WM_NAME", False); | ||||
@@ -724,15 +810,17 @@ struct Window::PrivateData { | |||||
{ | { | ||||
DISTRHO_SAFE_ASSERT_RETURN(winId != 0,); | 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) | #elif defined(DISTRHO_OS_MAC) | ||||
NSWindow* const parentWindow = [NSApp windowWithWindowNumber:winId]; | NSWindow* const parentWindow = [NSApp windowWithWindowNumber:winId]; | ||||
DISTRHO_SAFE_ASSERT_RETURN(parentWindow != nullptr,); | DISTRHO_SAFE_ASSERT_RETURN(parentWindow != nullptr,); | ||||
[parentWindow addChildWindow:mWindow | [parentWindow addChildWindow:mWindow | ||||
ordered:NSWindowAbove]; | ordered:NSWindowAbove]; | ||||
#elif defined(DISTRHO_OS_WINDOWS) | |||||
hwndParent = (HWND)winId; | |||||
SetWindowLongPtr(hwnd, GWLP_HWNDPARENT, (LONG_PTR)winId); | |||||
#else | #else | ||||
XSetTransientForHint(xDisplay, xWindow, static_cast< ::Window>(winId)); | XSetTransientForHint(xDisplay, xWindow, static_cast< ::Window>(winId)); | ||||
#endif | #endif | ||||
@@ -780,6 +868,15 @@ struct Window::PrivateData { | |||||
{ | { | ||||
puglProcessEvents(fView); | puglProcessEvents(fView); | ||||
#ifdef DISTRHO_OS_HAIKU | |||||
if (bApplication != nullptr) | |||||
{ | |||||
// bApplication->Lock(); | |||||
// bApplication->Loop(); | |||||
// bApplication->Unlock(); | |||||
} | |||||
#endif | |||||
#ifdef DISTRHO_OS_MAC | #ifdef DISTRHO_OS_MAC | ||||
if (fNeedsIdle) | if (fNeedsIdle) | ||||
{ | { | ||||
@@ -1164,12 +1261,10 @@ struct Window::PrivateData { | |||||
DISTRHO_DECLARE_NON_COPY_STRUCT(Modal) | DISTRHO_DECLARE_NON_COPY_STRUCT(Modal) | ||||
} fModal; | } 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) | #elif defined(DISTRHO_OS_MAC) | ||||
bool fNeedsIdle; | bool fNeedsIdle; | ||||
NSView<PuglGenericView>* mView; | NSView<PuglGenericView>* mView; | ||||
@@ -1179,6 +1274,12 @@ struct Window::PrivateData { | |||||
NSOpenPanel* fOpenFilePanel; | NSOpenPanel* fOpenFilePanel; | ||||
id fFilePanelDelegate; | id fFilePanelDelegate; | ||||
# endif | # endif | ||||
#elif defined(DISTRHO_OS_WINDOWS) | |||||
HWND hwnd; | |||||
HWND hwndParent; | |||||
# ifndef DGL_FILE_BROWSER_DISABLED | |||||
String fSelectedFile; | |||||
# endif | |||||
#else | #else | ||||
Display* xDisplay; | Display* xDisplay; | ||||
::Window xWindow; | ::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: | case WM_SIZE: | ||||
GetClientRect(view->impl->hwnd, &rect); | GetClientRect(view->impl->hwnd, &rect); | ||||
puglReshape(view, rect.right, rect.bottom); | puglReshape(view, rect.right, rect.bottom); | ||||
view->width = rect.right; | |||||
view->height = rect.bottom; | |||||
break; | break; | ||||
case WM_GETMINMAXINFO: | case WM_GETMINMAXINFO: | ||||
mmi = (MINMAXINFO*)lParam; | mmi = (MINMAXINFO*)lParam; | ||||
@@ -365,6 +365,8 @@ struct ParameterEnumerationValues { | |||||
values = nullptr; | values = nullptr; | ||||
} | } | ||||
} | } | ||||
DISTRHO_DECLARE_NON_COPY_STRUCT(ParameterEnumerationValues) | |||||
}; | }; | ||||
/** | /** | ||||
@@ -128,7 +128,12 @@ private: \ | |||||
StructName& operator=(StructName&) = delete; \ | StructName& operator=(StructName&) = delete; \ | ||||
StructName& operator=(const StructName&) = delete; | StructName& operator=(const StructName&) = delete; | ||||
#else | #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 | #endif | ||||
/* Define DISTRHO_PREVENT_HEAP_ALLOCATION */ | /* Define DISTRHO_PREVENT_HEAP_ALLOCATION */ | ||||
@@ -97,7 +97,7 @@ | |||||
// Define DISTRHO_PLUGIN_HAS_EMBED_UI if needed | // Define DISTRHO_PLUGIN_HAS_EMBED_UI if needed | ||||
#ifndef DISTRHO_PLUGIN_HAS_EMBED_UI | #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 | # define DISTRHO_PLUGIN_HAS_EMBED_UI 1 | ||||
# else | # else | ||||
# define DISTRHO_PLUGIN_HAS_EMBED_UI 0 | # define DISTRHO_PLUGIN_HAS_EMBED_UI 0 | ||||
@@ -139,7 +139,12 @@ | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
// Disable UI if DGL or External UI is not available | // 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 | # undef DISTRHO_PLUGIN_HAS_UI | ||||
# define DISTRHO_PLUGIN_HAS_UI 0 | # define DISTRHO_PLUGIN_HAS_UI 0 | ||||
#endif | #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() | void lv2_activate() | ||||
{ | { | ||||
#if DISTRHO_PLUGIN_WANT_TIMEPOS | #if DISTRHO_PLUGIN_WANT_TIMEPOS | ||||
@@ -514,18 +552,13 @@ public: | |||||
for (uint32_t i=0, count=fPlugin.getParameterCount(); i < count; ++i) | for (uint32_t i=0, count=fPlugin.getParameterCount(); i < count; ++i) | ||||
{ | { | ||||
if (fPortControls[i] == nullptr) | |||||
if (!getPortControlValue(i, curValue)) | |||||
continue; | continue; | ||||
curValue = *fPortControls[i]; | |||||
if (fPlugin.isParameterInput(i) && d_isNotEqual(fLastControlValues[i], curValue)) | if (fPlugin.isParameterInput(i) && d_isNotEqual(fLastControlValues[i], curValue)) | ||||
{ | { | ||||
fLastControlValues[i] = curValue; | fLastControlValues[i] = curValue; | ||||
if (fPlugin.getParameterDesignation(i) == kParameterDesignationBypass) | |||||
curValue = 1.0f - curValue; | |||||
fPlugin.setParameterValue(i, curValue); | fPlugin.setParameterValue(i, curValue); | ||||
} | } | ||||
} | } | ||||
@@ -757,8 +790,7 @@ public: | |||||
fLastControlValues[i] = fPlugin.getParameterValue(i); | fLastControlValues[i] = fPlugin.getParameterValue(i); | ||||
if (fPortControls[i] != nullptr) | |||||
*fPortControls[i] = fLastControlValues[i]; | |||||
setPortControlValue(i, fLastControlValues[i]); | |||||
} | } | ||||
# if DISTRHO_PLUGIN_WANT_FULL_STATE | # if DISTRHO_PLUGIN_WANT_FULL_STATE | ||||
@@ -1047,8 +1079,7 @@ private: | |||||
{ | { | ||||
curValue = fLastControlValues[i] = fPlugin.getParameterValue(i); | curValue = fLastControlValues[i] = fPlugin.getParameterValue(i); | ||||
if (fPortControls[i] != nullptr) | |||||
*fPortControls[i] = curValue; | |||||
setPortControlValue(i, curValue); | |||||
} | } | ||||
else if ((fPlugin.getParameterHints(i) & kParameterIsTrigger) == kParameterIsTrigger) | else if ((fPlugin.getParameterHints(i) & kParameterIsTrigger) == kParameterIsTrigger) | ||||
{ | { | ||||
@@ -160,7 +160,7 @@ static const char* const lv2ManifestUiSupportedOptions[] = | |||||
}; | }; | ||||
#endif // DISTRHO_PLUGIN_HAS_UI | #endif // DISTRHO_PLUGIN_HAS_UI | ||||
static void addAttribute(String& text, | |||||
static void addAttribute(DISTRHO_NAMESPACE::String& text, | |||||
const char* const attribute, | const char* const attribute, | ||||
const char* const values[], | const char* const values[], | ||||
const uint indent, | const uint indent, | ||||
@@ -561,7 +561,14 @@ void lv2_generate_ttl(const char* const basename) | |||||
pluginString += " [\n"; | pluginString += " [\n"; | ||||
pluginString += " rdfs:label \"\"\"" + enumValue.label + "\"\"\" ;\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) | if (j+1 == enumValues.count) | ||||
pluginString += " ] ;\n\n"; | pluginString += " ] ;\n\n"; | ||||
@@ -606,6 +613,7 @@ void lv2_generate_ttl(const char* const basename) | |||||
else | else | ||||
{ | { | ||||
pluginString += " unit:unit [\n"; | pluginString += " unit:unit [\n"; | ||||
pluginString += " a unit:Unit ;\n"; | |||||
pluginString += " rdfs:label \"" + unit + "\" ;\n"; | pluginString += " rdfs:label \"" + unit + "\" ;\n"; | ||||
pluginString += " unit:symbol \"" + unit + "\" ;\n"; | pluginString += " unit:symbol \"" + unit + "\" ;\n"; | ||||
pluginString += " unit:render \"%f " + 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); | d_stdout("handlePluginKeyEvent %i %i %li\n", down, index, (long int)value); | ||||
using namespace DGL_NAMESPACE; | |||||
int special = 0; | int special = 0; | ||||
switch (value) | switch (value) | ||||
{ | { | ||||
@@ -588,7 +590,8 @@ public: | |||||
return 1; | return 1; | ||||
case effEditOpen: | case effEditOpen: | ||||
if (fVstUI == nullptr) | |||||
delete fVstUI; // hosts which don't pair effEditOpen/effEditClose calls (Minihost Modular) | |||||
fVstUI = nullptr; | |||||
{ | { | ||||
# if DISTRHO_OS_MAC | # if DISTRHO_OS_MAC | ||||
if (! fUsingNsView) | if (! fUsingNsView) | ||||
@@ -920,25 +923,25 @@ public: | |||||
return ranges.getNormalizedValue(fPlugin.getParameterValue(index)); | 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 uint32_t hints(fPlugin.getParameterHints(index)); | ||||
const ParameterRanges& ranges(fPlugin.getParameterRanges(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) | if (hints & kParameterIsBoolean) | ||||
{ | { | ||||
const float midRange = ranges.min + (ranges.max - ranges.min) / 2.0f; | 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) | if (hints & kParameterIsInteger) | ||||
{ | { | ||||
value = std::round(value); | |||||
realValue = std::round(realValue); | |||||
} | } | ||||
const float realValue(value); | |||||
fPlugin.setParameterValue(index, realValue); | fPlugin.setParameterValue(index, realValue); | ||||
#if DISTRHO_PLUGIN_HAS_UI | #if DISTRHO_PLUGIN_HAS_UI | ||||
@@ -149,9 +149,12 @@ public: | |||||
fUI.setSampleRate(sampleRate, true); | fUI.setSampleRate(sampleRate, true); | ||||
} | } | ||||
void dssiui_show() | |||||
void dssiui_show(const bool focus = false) | |||||
{ | { | ||||
fUI.setWindowVisible(true); | fUI.setWindowVisible(true); | ||||
if (focus) | |||||
fUI.focus(); | |||||
} | } | ||||
void dssiui_hide() | void dssiui_hide() | ||||
@@ -389,7 +392,7 @@ int main(int argc, char* argv[]) | |||||
gUiTitle = "DSSI UI Test"; | gUiTitle = "DSSI UI Test"; | ||||
initUiIfNeeded(); | initUiIfNeeded(); | ||||
globalUI->dssiui_show(); | |||||
globalUI->dssiui_show(true); | |||||
globalUI->exec(); | globalUI->exec(); | ||||
delete globalUI; | delete globalUI; | ||||
@@ -406,6 +406,10 @@ public: | |||||
return true; | return true; | ||||
} | } | ||||
void focus() | |||||
{ | |||||
} | |||||
void quit() | void quit() | ||||
{ | { | ||||
DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr,); | DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr,); | ||||
@@ -430,6 +434,11 @@ public: | |||||
fUI->uiIdle(); | fUI->uiIdle(); | ||||
} | } | ||||
void focus() | |||||
{ | |||||
glWindow.focus(); | |||||
} | |||||
bool idle() | bool idle() | ||||
{ | { | ||||
DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr, false); | DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr, false); | ||||
@@ -519,7 +528,7 @@ public: | |||||
return glWindow.handlePluginKeyboard(press, key); | 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); | return glWindow.handlePluginSpecial(press, key); | ||||
} | } | ||||
@@ -19,6 +19,10 @@ | |||||
#include "Cairo.hpp" | #include "Cairo.hpp" | ||||
#include "Window.hpp" | #include "Window.hpp" | ||||
START_NAMESPACE_DGL | |||||
// ----------------------------------------------------------------------- | |||||
static const char* banner = | static const char* banner = | ||||
" " | " " | ||||
" * * * * * " | " * * * * * " | ||||
@@ -90,3 +94,7 @@ void DemoWidgetBanner::onDisplay() | |||||
} | } | ||||
} | } | ||||
} | } | ||||
// ----------------------------------------------------------------------- | |||||
END_NAMESPACE_DGL |
@@ -16,9 +16,19 @@ | |||||
#include "Widget.hpp" | #include "Widget.hpp" | ||||
START_NAMESPACE_DGL | |||||
// ----------------------------------------------------------------------- | |||||
class DemoWidgetBanner : public Widget | class DemoWidgetBanner : public Widget | ||||
{ | { | ||||
public: | public: | ||||
explicit DemoWidgetBanner(Widget* group); | explicit DemoWidgetBanner(Widget* group); | ||||
void onDisplay() override; | void onDisplay() override; | ||||
}; | }; | ||||
// ----------------------------------------------------------------------- | |||||
END_NAMESPACE_DGL | |||||
using DGL_NAMESPACE::DemoWidgetBanner; |
@@ -19,6 +19,10 @@ | |||||
#include "Cairo.hpp" | #include "Cairo.hpp" | ||||
#include "Window.hpp" | #include "Window.hpp" | ||||
START_NAMESPACE_DGL | |||||
// ----------------------------------------------------------------------- | |||||
DemoWidgetClickable::DemoWidgetClickable(Widget* group) | DemoWidgetClickable::DemoWidgetClickable(Widget* group) | ||||
: Widget(group) | : Widget(group) | ||||
{ | { | ||||
@@ -77,3 +81,7 @@ bool DemoWidgetClickable::onMouse(const MouseEvent& event) | |||||
return Widget::onMouse(event); | return Widget::onMouse(event); | ||||
} | } | ||||
// ----------------------------------------------------------------------- | |||||
END_NAMESPACE_DGL |
@@ -16,6 +16,10 @@ | |||||
#include "Widget.hpp" | #include "Widget.hpp" | ||||
START_NAMESPACE_DGL | |||||
// ----------------------------------------------------------------------- | |||||
class DemoWidgetClickable : public Widget | class DemoWidgetClickable : public Widget | ||||
{ | { | ||||
public: | public: | ||||
@@ -26,3 +30,9 @@ public: | |||||
private: | private: | ||||
unsigned fColorId = 0; | unsigned fColorId = 0; | ||||
}; | }; | ||||
// ----------------------------------------------------------------------- | |||||
END_NAMESPACE_DGL | |||||
using DGL_NAMESPACE::DemoWidgetClickable; |
@@ -35,7 +35,7 @@ TARGETS += jack | |||||
endif | endif | ||||
endif | endif | ||||
ifeq ($(LINUX),true) | |||||
ifneq ($(MACOS_OR_WINDOWS),true) | |||||
ifeq ($(HAVE_CAIRO),true) | ifeq ($(HAVE_CAIRO),true) | ||||
ifeq ($(HAVE_LIBLO),true) | ifeq ($(HAVE_LIBLO),true) | ||||
TARGETS += dssi | TARGETS += dssi | ||||
@@ -21,9 +21,12 @@ FILES_UI = \ | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
# Do some magic | # Do some magic | ||||
UI_TYPE = external | |||||
include ../../Makefile.plugins.mk | include ../../Makefile.plugins.mk | ||||
ifneq ($(HAIKU),true) | |||||
LINK_FLAGS += -ldl | LINK_FLAGS += -ldl | ||||
endif | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
# Enable all possible plugin types | # Enable all possible plugin types | ||||
@@ -29,6 +29,10 @@ | |||||
#define DISTRHO_UI_USER_RESIZABLE 1 | #define DISTRHO_UI_USER_RESIZABLE 1 | ||||
#define DISTRHO_UI_USE_NANOVG 1 | #define DISTRHO_UI_USE_NANOVG 1 | ||||
#ifdef __MOD_DEVICES__ | |||||
#define DISTRHO_PLUGIN_USES_MODGUI 1 | |||||
#endif | |||||
enum Parameters { | enum Parameters { | ||||
kParameterBufferSize = 0, | kParameterBufferSize = 0, | ||||
kParameterTimePlaying, | 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 | # Enable all possible plugin types | ||||
ifeq ($(LINUX),true) | |||||
ifneq ($(MACOS_OR_WINDOWS),true) | |||||
TARGETS += ladspa | TARGETS += ladspa | ||||
TARGETS += dssi | TARGETS += dssi | ||||
endif | endif | ||||
@@ -21,7 +21,7 @@ START_NAMESPACE_DISTRHO | |||||
/** | /** | ||||
We need the Color class from DGL. | We need the Color class from DGL. | ||||
*/ | */ | ||||
using DGL::Color; | |||||
using DGL_NAMESPACE::Color; | |||||
/** | /** | ||||
Smooth meters a bit. | Smooth meters a bit. | ||||
@@ -32,7 +32,7 @@ TARGETS += jack | |||||
endif | endif | ||||
endif | endif | ||||
ifeq ($(LINUX),true) | |||||
ifneq ($(MACOS_OR_WINDOWS),true) | |||||
ifeq ($(HAVE_LIBLO),true) | ifeq ($(HAVE_LIBLO),true) | ||||
ifeq ($(HAVE_OPENGL),true) | ifeq ($(HAVE_OPENGL),true) | ||||
TARGETS += dssi | TARGETS += dssi | ||||
@@ -21,7 +21,7 @@ START_NAMESPACE_DISTRHO | |||||
/** | /** | ||||
We need the rectangle class from DGL. | We need the rectangle class from DGL. | ||||
*/ | */ | ||||
using DGL::Rectangle; | |||||
using DGL_NAMESPACE::Rectangle; | |||||
// ----------------------------------------------------------------------------------------------------------- | // ----------------------------------------------------------------------------------------------------------- | ||||
@@ -32,7 +32,7 @@ TARGETS += jack | |||||
endif | endif | ||||
endif | endif | ||||
ifeq ($(LINUX),true) | |||||
ifneq ($(MACOS_OR_WINDOWS),true) | |||||
ifeq ($(HAVE_LIBLO),true) | ifeq ($(HAVE_LIBLO),true) | ||||
ifeq ($(HAVE_OPENGL),true) | ifeq ($(HAVE_OPENGL),true) | ||||
TARGETS += ladspa | TARGETS += ladspa | ||||
@@ -18,6 +18,11 @@ | |||||
START_NAMESPACE_DISTRHO | START_NAMESPACE_DISTRHO | ||||
/** | |||||
We need the rectangle class from DGL. | |||||
*/ | |||||
using DGL_NAMESPACE::Rectangle; | |||||
// ----------------------------------------------------------------------------------------------------------- | // ----------------------------------------------------------------------------------------------------------- | ||||
class ExampleUIParameters : public UI | class ExampleUIParameters : public UI | ||||
@@ -32,7 +32,7 @@ TARGETS += jack | |||||
endif | endif | ||||
endif | endif | ||||
ifeq ($(LINUX),true) | |||||
ifneq ($(MACOS_OR_WINDOWS),true) | |||||
ifeq ($(HAVE_LIBLO),true) | ifeq ($(HAVE_LIBLO),true) | ||||
ifeq ($(HAVE_OPENGL),true) | ifeq ($(HAVE_OPENGL),true) | ||||
TARGETS += dssi | TARGETS += dssi | ||||
@@ -1,19 +1,29 @@ | |||||
#!/usr/bin/makefile -f | #!/usr/bin/makefile -f | ||||
include ../../Makefile.base.mk | |||||
all: build | all: build | ||||
ifeq ($(WINDOWS),true) | 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 | ../lv2_ttl_generator.exe: lv2_ttl_generator.c | ||||
$(CC) $< $(CFLAGS) -o $@ $(LDFLAGS) -static | $(CC) $< $(CFLAGS) -o $@ $(LDFLAGS) -static | ||||
touch ../lv2_ttl_generator | 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: | clean: | ||||
rm -f ../lv2_ttl_generator ../lv2_ttl_generator.exe | rm -f ../lv2_ttl_generator ../lv2_ttl_generator.exe |