commit a3d11e4dc0aec477d0cef99785c299dea5f46bb1
parent 77ef4b9b31e4d5ec9511869e8a943b668e9abfd9
Author: falkTX <falktx@falktx.com>
Date: Mon, 17 May 2021 17:36:45 +0100
Build on windows, though doesnt quite work yet
Signed-off-by: falkTX <falktx@falktx.com>
Diffstat:
5 files changed, 206 insertions(+), 72 deletions(-)
diff --git a/dgl/Makefile b/dgl/Makefile
@@ -14,7 +14,7 @@ BUILD_CXX_FLAGS += -Isrc/pugl-upstream/include
LINK_FLAGS += $(DGL_LIBS)
# TODO fix these after pugl-upstream is done
-BUILD_CXX_FLAGS += -Wno-missing-field-initializers -Wno-extra -Wno-narrowing
+BUILD_CXX_FLAGS += -Wno-attributes -Wno-extra -Wno-missing-field-initializers -Wno-narrowing
# ifneq ($(MACOS_OLD),true)
# needed by sofd right now, fix later
@@ -39,36 +39,42 @@ OBJS_common = \
../build/dgl/WidgetPrivateData.cpp.o \
../build/dgl/Window.cpp.o \
../build/dgl/WindowPrivateData.cpp.o
-
# ../build/dgl/WindowFileBrowser.cpp.o
-# TODO: ImageWidgets.cpp
-
# ---------------------------------------------------------------------------------------------------------------------
OBJS_cairo = $(OBJS_common) \
- ../build/dgl/Cairo.cpp.cairo.o \
- ../build/dgl/pugl.cpp.cairo.o
+ ../build/dgl/Cairo.cpp.cairo.o
-# ifeq ($(MACOS),true)
-# OBJS_cairo += ../build/dgl/Window.mm.cairo.o
-# else
-# OBJS_cairo += ../build/dgl/Window.cpp.cairo.o
-# endif
+ifeq ($(MACOS),true)
+OBJS_cairo += ../build/dgl/pugl.mm.cairo.o
+else
+OBJS_cairo += ../build/dgl/pugl.cpp.cairo.o
+endif
# ---------------------------------------------------------------------------------------------------------------------
OBJS_opengl = $(OBJS_common) \
../build/dgl/ImageWidgets.cpp.o \
../build/dgl/OpenGL.cpp.opengl.o \
- ../build/dgl/NanoVG.cpp.opengl.o \
- ../build/dgl/pugl.cpp.opengl.o
+ ../build/dgl/NanoVG.cpp.opengl.o
-# ifeq ($(MACOS),true)
-# OBJS_opengl += ../build/dgl/Window.mm.opengl.o
-# else
-# OBJS_opengl += ../build/dgl/Window.cpp.opengl.o
-# endif
+ifeq ($(MACOS),true)
+OBJS_opengl += ../build/dgl/pugl.mm.opengl.o
+else
+OBJS_opengl += ../build/dgl/pugl.cpp.opengl.o
+endif
+
+# ---------------------------------------------------------------------------------------------------------------------
+
+OBJS_vulkan = $(OBJS_common) \
+ ../build/dgl/Cairo.cpp.vulkan.o
+
+ifeq ($(MACOS),true)
+OBJS_vulkan += ../build/dgl/pugl.mm.vulkan.o
+else
+OBJS_vulkan += ../build/dgl/pugl.cpp.vulkan.o
+endif
# ---------------------------------------------------------------------------------------------------------------------
@@ -82,6 +88,10 @@ TARGETS += ../build/libdgl-opengl.a
TARGETS += ../build/libdgl.a
endif
+ifeq ($(HAVE_VULKAN),true)
+TARGETS += ../build/libdgl-vulkan.a
+endif
+
# ---------------------------------------------------------------------------------------------------------------------
all: $(TARGETS)
@@ -100,6 +110,12 @@ all: $(TARGETS)
$(SILENT)rm -f $@
$(SILENT)$(AR) crs $@ $^
+../build/libdgl-vulkan.a: $(OBJS_vulkan)
+ -@mkdir -p ../build
+ @echo "Creating libdgl-vulkan.a"
+ $(SILENT)rm -f $@
+ $(SILENT)$(AR) crs $@ $^
+
# Compat name, to be removed soon
../build/libdgl.a: ../build/libdgl-opengl.a
@echo "Symlinking libdgl.a"
@@ -117,6 +133,11 @@ all: $(TARGETS)
@echo "Compiling $<"
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@
+../build/dgl/%.mm.o: src/%.mm
+ -@mkdir -p ../build/dgl
+ @echo "Compiling $<"
+ $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -c -ObjC++ -o $@
+
# ---------------------------------------------------------------------------------------------------------------------
../build/dgl/%.cpp.cairo.o: src/%.cpp
@@ -124,15 +145,10 @@ all: $(TARGETS)
@echo "Compiling $< (Cairo variant)"
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(CAIRO_FLAGS) -DDGL_CAIRO -c -o $@
-# ../build/dgl/Window.cpp.cairo.o: src/Window.cpp src/sofd/* src/pugl-upstream/*
-# -@mkdir -p ../build/dgl
-# @echo "Compiling $< (Cairo variant)"
-# $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(CAIRO_FLAGS) -DDGL_CAIRO -c -o $@
-#
-# ../build/dgl/Window.mm.cairo.o: src/Window.cpp src/sofd/* src/pugl-upstream/*
-# -@mkdir -p ../build/dgl
-# @echo "Compiling $< (Cairo variant)"
-# $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(CAIRO_FLAGS) -DDGL_CAIRO -ObjC++ -c -o $@
+../build/dgl/%.mm.cairo.o: src/%.mm
+ -@mkdir -p ../build/dgl
+ @echo "Compiling $< (Cairo variant)"
+ $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(CAIRO_FLAGS) -DDGL_CAIRO -c -ObjC++ -o $@
# ---------------------------------------------------------------------------------------------------------------------
@@ -141,15 +157,22 @@ all: $(TARGETS)
@echo "Compiling $< (OpenGL variant)"
$(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(OPENGL_FLAGS) -DDGL_OPENGL -c -o $@
-# ../build/dgl/Window.cpp.opengl.o: src/Window.cpp src/sofd/* src/pugl-upstream/*
-# -@mkdir -p ../build/dgl
-# @echo "Compiling $< (OpenGL variant)"
-# $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(OPENGL_FLAGS) -DDGL_OPENGL -c -o $@
-#
-# ../build/dgl/Window.mm.opengl.o: src/Window.cpp src/sofd/* src/pugl-upstream/*
-# -@mkdir -p ../build/dgl
-# @echo "Compiling $< (OpenGL variant)"
-# $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(OPENGL_FLAGS) -DDGL_OPENGL -ObjC++ -c -o $@
+../build/dgl/%.mm.opengl.o: src/%.mm
+ -@mkdir -p ../build/dgl
+ @echo "Compiling $< (OpenGL variant)"
+ $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(OPENGL_FLAGS) -DDGL_OPENGL -c -ObjC++ -o $@
+
+# ---------------------------------------------------------------------------------------------------------------------
+
+../build/dgl/%.cpp.vulkan.o: src/%.cpp
+ -@mkdir -p ../build/dgl
+ @echo "Compiling $< (Vulkan variant)"
+ $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(VULKAN_FLAGS) -DDGL_VULKAN -c -o $@
+
+../build/dgl/%.mm.vulkan.o: src/%.mm
+ -@mkdir -p ../build/dgl
+ @echo "Compiling $< (Vulkan variant)"
+ $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) $(VULKAN_FLAGS) -DDGL_VULKAN -c -ObjC++ -o $@
# ---------------------------------------------------------------------------------------------------------------------
@@ -164,5 +187,6 @@ debug:
-include $(OBJS_common:%.o=%.d)
-include $(OBJS_cairo:%.o=%.d)
-include $(OBJS_opengl:%.o=%.d)
+-include $(OBJS_vulkan:%.o=%.d)
# ---------------------------------------------------------------------------------------------------------------------
diff --git a/dgl/src/WindowPrivateData.cpp b/dgl/src/WindowPrivateData.cpp
@@ -19,11 +19,13 @@
#include "pugl.hpp"
-#include <cinttypes>
+#define DGL_DEBUG_EVENTS
-START_NAMESPACE_DGL
+#if defined(DEBUG) && defined(DGL_DEBUG_EVENTS)
+# include <cinttypes>
+#endif
-#define DGL_DEBUG_EVENTS
+START_NAMESPACE_DGL
#if defined(DEBUG) && defined(DGL_DEBUG_EVENTS)
# define DGL_DBG(msg) std::fprintf(stderr, "%s", msg);
diff --git a/dgl/src/pugl.cpp b/dgl/src/pugl.cpp
@@ -25,7 +25,36 @@
#if defined(DISTRHO_OS_HAIKU)
#elif defined(DISTRHO_OS_MAC)
+# import <Cocoa/Cocoa.h>
+# include <dlfcn.h>
+# include <mach/mach_time.h>
+# ifdef DGL_CAIRO
+# include <cairo.h>
+# include <cairo-quartz.h>
+# endif
+# ifdef DGL_OPENGL
+# include <OpenGL/gl.h>
+# endif
+# ifdef DGL_VULKAN
+# import <QuartzCore/CAMetalLayer.h>
+# include <vulkan/vulkan_core.h>
+# include <vulkan/vulkan_macos.h>
+# endif
#elif defined(DISTRHO_OS_WINDOWS)
+# include <wctype.h>
+# include <windows.h>
+# include <windowsx.h>
+# ifdef DGL_CAIRO
+# include <cairo.h>
+# include <cairo-win32.h>
+# endif
+# ifdef DGL_OPENGL
+# include <GL/gl.h>
+# endif
+# ifdef DGL_VULKAN
+# include <vulkan/vulkan.h>
+# include <vulkan/vulkan_win32.h>
+# endif
#else
# include <dlfcn.h>
# include <sys/select.h>
@@ -51,6 +80,7 @@
# include <cairo-xlib.h>
# endif
# ifdef DGL_OPENGL
+# include <GL/gl.h>
# include <GL/glx.h>
# endif
# ifdef DGL_VULKAN
@@ -67,9 +97,33 @@ START_NAMESPACE_DGL
#if defined(DISTRHO_OS_HAIKU)
#elif defined(DISTRHO_OS_MAC)
+/*
# define PuglWindow DISTRHO_JOIN_MACRO(PuglWindow, DGL_NAMESPACE)
# define PuglOpenGLView DISTRHO_JOIN_MACRO(PuglOpenGLView, DGL_NAMESPACE)
+*/
+# import "pugl-upstream/src/mac.m"
+# import "pugl-upstream/src/mac_stub.m"
+# ifdef DGL_CAIRO
+# import "pugl-upstream/src/mac_cairo.m"
+# endif
+# ifdef DGL_OPENGL
+# import "pugl-upstream/src/mac_gl.m"
+# endif
+# ifdef DGL_VULKAN
+# import "pugl-upstream/src/mac_vulkan.m"
+# endif
#elif defined(DISTRHO_OS_WINDOWS)
+# include "pugl-upstream/src/win.c"
+# include "pugl-upstream/src/win_stub.c"
+# ifdef DGL_CAIRO
+# include "pugl-upstream/src/win_cairo.c"
+# endif
+# ifdef DGL_OPENGL
+# include "pugl-upstream/src/win_gl.c"
+# endif
+# ifdef DGL_VULKAN
+# include "pugl-upstream/src/win_vulkan.c"
+# endif
#else
# include "pugl-upstream/src/x11.c"
# include "pugl-upstream/src/x11_stub.c"
@@ -120,7 +174,7 @@ void puglRaiseWindow(PuglView* view)
// --------------------------------------------------------------------------------------------------------------------
// set backend that matches current build
-void puglSetMatchingBackendForCurrentBuild(PuglView* view)
+void puglSetMatchingBackendForCurrentBuild(PuglView* const view)
{
#ifdef DGL_CAIRO
puglSetBackend(view, puglCairoBackend());
@@ -136,7 +190,7 @@ void puglSetMatchingBackendForCurrentBuild(PuglView* view)
// --------------------------------------------------------------------------------------------------------------------
// Combine puglSetMinSize and puglSetAspectRatio
-PuglStatus puglSetGeometryConstraints(PuglView* view, unsigned int width, unsigned int height, bool aspect)
+PuglStatus puglSetGeometryConstraints(PuglView* const view, const uint width, const uint height, const bool aspect)
{
view->minWidth = width;
view->minHeight = height;
@@ -170,16 +224,18 @@ PuglStatus puglSetGeometryConstraints(PuglView* view, unsigned int width, unsign
// --------------------------------------------------------------------------------------------------------------------
// set window size without changing frame x/y position
-PuglStatus puglSetWindowSize(PuglView* view, unsigned int width, unsigned int height)
+PuglStatus puglSetWindowSize(PuglView* const view, const uint width, const uint height)
{
#if defined(DISTRHO_OS_HAIKU) || defined(DISTRHO_OS_MAC)
- // TODO
- const PuglRect frame = { 0.0, 0.0, (double)width, (double)height };
+ // keep upstream behaviour
+ const PuglRect frame = { view->frame.x, view->frame.y, (double)width, (double)height };
return puglSetFrame(view, frame);
#elif defined(DISTRHO_OS_WINDOWS)
// matches upstream pugl, except we add SWP_NOMOVE flag
if (view->impl->hwnd)
{
+ const PuglRect frame = view->frame;
+
RECT rect = { (long)frame.x,
(long)frame.y,
(long)frame.x + (long)frame.width,
@@ -202,23 +258,6 @@ PuglStatus puglSetWindowSize(PuglView* view, unsigned int width, unsigned int he
{
if (! XResizeWindow(view->world->impl->display, view->impl->win, width, height))
return PUGL_UNKNOWN_ERROR;
-#if 0
- if (! fResizable)
- {
- XSizeHints sizeHints;
- memset(&sizeHints, 0, sizeof(sizeHints));
-
- sizeHints.flags = PSize|PMinSize|PMaxSize;
- sizeHints.width = static_cast<int>(width);
- sizeHints.height = static_cast<int>(height);
- sizeHints.min_width = static_cast<int>(width);
- sizeHints.min_height = static_cast<int>(height);
- sizeHints.max_width = static_cast<int>(width);
- sizeHints.max_height = static_cast<int>(height);
-
- XSetWMNormalHints(xDisplay, xWindow, &sizeHints);
- }
-#endif
}
#endif
@@ -241,7 +280,7 @@ void puglOnDisplayPrepare(PuglView*)
// --------------------------------------------------------------------------------------------------------------------
// DGL specific, build-specific fallback resize
-void puglFallbackOnResize(PuglView* view)
+void puglFallbackOnResize(PuglView* const view)
{
#ifdef DGL_OPENGL
glEnable(GL_BLEND);
@@ -255,6 +294,60 @@ void puglFallbackOnResize(PuglView* view)
#endif
}
+#ifdef DISTRHO_OS_WINDOWS
+// --------------------------------------------------------------------------------------------------------------------
+// win32 specific, call ShowWindow with SW_RESTORE
+
+void puglWin32RestoreWindow(PuglView* const view)
+{
+ PuglInternals* impl = view->impl;
+ DISTRHO_SAFE_ASSERT_RETURN(impl->hwnd != nullptr,);
+
+ ShowWindow(impl->hwnd, SW_RESTORE);
+ SetFocus(impl->hwnd);
+}
+
+// --------------------------------------------------------------------------------------------------------------------
+// win32 specific, center view based on parent coordinates (if there is one)
+
+void puglWin32ShowWindowCentered(PuglView* const view)
+{
+ PuglInternals* impl = view->impl;
+ DISTRHO_SAFE_ASSERT_RETURN(impl->hwnd != nullptr,);
+
+ RECT rectChild, rectParent;
+
+ if (view->transientParent != 0 &&
+ GetWindowRect(impl->hwnd, &rectChild) &&
+ GetWindowRect((HWND)view->transientParent, &rectParent))
+ {
+ SetWindowPos(impl->hwnd, (HWND)view->transientParent,
+ rectParent.left + (rectChild.right-rectChild.left)/2,
+ rectParent.top + (rectChild.bottom-rectChild.top)/2,
+ 0, 0, SWP_SHOWWINDOW|SWP_NOSIZE);
+ }
+ else
+ {
+ ShowWindow(impl->hwnd, SW_SHOWNORMAL);
+ }
+
+ SetFocus(impl->hwnd);
+}
+
+// --------------------------------------------------------------------------------------------------------------------
+// win32 specific, set or unset WS_SIZEBOX style flag
+
+void puglWin32SetWindowResizable(PuglView* const view, const bool resizable)
+{
+ PuglInternals* impl = view->impl;
+ DISTRHO_SAFE_ASSERT_RETURN(impl->hwnd != nullptr,);
+
+ const int winFlags = resizable ? GetWindowLong(impl->hwnd, GWL_STYLE) | WS_SIZEBOX
+ : GetWindowLong(impl->hwnd, GWL_STYLE) & ~WS_SIZEBOX;
+ SetWindowLong(impl->hwnd, GWL_STYLE, winFlags);
+}
+#endif
+
// --------------------------------------------------------------------------------------------------------------------
END_NAMESPACE_DGL
diff --git a/dgl/src/pugl.hpp b/dgl/src/pugl.hpp
@@ -28,6 +28,7 @@ START_NAMESPACE_DGL
// --------------------------------------------------------------------------------------------------------------------
+#define PUGL_API
#define PUGL_DISABLE_DEPRECATED
#include "pugl-upstream/include/pugl/pugl.h"
@@ -65,6 +66,20 @@ puglOnDisplayPrepare(PuglView* view);
PUGL_API void
puglFallbackOnResize(PuglView* view);
+#ifdef DISTRHO_OS_WINDOWS
+// win32 specific, call ShowWindow with SW_RESTORE
+PUGL_API void
+puglWin32RestoreWindow(PuglView* view);
+
+// win32 specific, center view based on parent coordinates (if there is one)
+PUGL_API void
+puglWin32ShowWindowCentered(PuglView* view);
+
+// win32 specific, set or unset WS_SIZEBOX style flag
+PUGL_API void
+puglWin32SetWindowResizable(PuglView* view, bool resizable);
+#endif
+
PUGL_END_DECLS
// --------------------------------------------------------------------------------------------------------------------
diff --git a/tests/Makefile b/tests/Makefile
@@ -16,7 +16,7 @@ BUILD_CXX_FLAGS += $(DGL_FLAGS) -I.. -I../dgl/src/pugl-upstream/include -DDONT_S
LINK_FLAGS += -lpthread
# TODO fix within pugl
-BUILD_CXX_FLAGS += -Wno-missing-field-initializers -Wno-extra
+BUILD_CXX_FLAGS += -Wno-extra -Wno-missing-field-initializers
# ---------------------------------------------------------------------------------------------------------------------
@@ -33,8 +33,8 @@ ifeq ($(HAVE_VULKAN),true)
WTESTS = Window.vulkan
endif
-TARGETS = $(TESTS:%=../build/tests/%)
-TARGETS += $(WTESTS:Window.%=../build/tests/Window.%)
+TARGETS = $(TESTS:%=../build/tests/%$(APP_EXT))
+TARGETS += $(WTESTS:Window.%=../build/tests/Window.%$(APP_EXT))
OBJS = $(TESTS:%=../build/tests/%.cpp.o)
OBJS += $(WTESTS:Window.%=../build/tests/Window.cpp.%.o)
@@ -102,31 +102,31 @@ clean:
# ---------------------------------------------------------------------------------------------------------------------
# linking steps
-../build/tests/%: ../build/tests/%.cpp.o
+../build/tests/%$(APP_EXT): ../build/tests/%.cpp.o
@echo "Linking $*"
$(SILENT)$(CXX) $< $(LINK_FLAGS) $(DGL_SYSTEM_LIBS) -o $@
-../build/tests/%.cairo: ../build/tests/%.cpp.cairo.o
+../build/tests/%.cairo$(APP_EXT): ../build/tests/%.cpp.cairo.o
@echo "Linking $*"
$(SILENT)$(CXX) $< $(LINK_FLAGS) $(DGL_SYSTEM_LIBS) $(CAIRO_LIBS) -o $@
-../build/tests/%.opengl: ../build/tests/%.cpp.opengl.o
+../build/tests/%.opengl$(APP_EXT): ../build/tests/%.cpp.opengl.o
@echo "Linking $*"
$(SILENT)$(CXX) $< $(LINK_FLAGS) $(DGL_SYSTEM_LIBS) $(OPENGL_LIBS) -o $@
-../build/tests/%.vulkan: ../build/tests/%.cpp.vulkan.o
+../build/tests/%.vulkan$(APP_EXT): ../build/tests/%.cpp.vulkan.o
@echo "Linking $*"
$(SILENT)$(CXX) $< $(LINK_FLAGS) $(DGL_SYSTEM_LIBS) $(VULKAN_LIBS) -o $@
-../build/tests/Demo.cairo: ../build/tests/Demo.cpp.cairo.o ../build/libdgl-cairo.a
+../build/tests/Demo.cairo$(APP_EXT): ../build/tests/Demo.cpp.cairo.o ../build/libdgl-cairo.a
@echo "Linking Demo (Cairo)"
$(SILENT)$(CXX) $^ $(LINK_FLAGS) $(DGL_SYSTEM_LIBS) $(CAIRO_LIBS) -o $@
-../build/tests/Demo.opengl: ../build/tests/Demo.cpp.opengl.o ../build/libdgl-opengl.a
+../build/tests/Demo.opengl$(APP_EXT): ../build/tests/Demo.cpp.opengl.o ../build/libdgl-opengl.a
@echo "Linking Demo (OpenGL)"
$(SILENT)$(CXX) $^ $(LINK_FLAGS) $(DGL_SYSTEM_LIBS) $(OPENGL_LIBS) -o $@
-../build/tests/Demo.vulkan: ../build/tests/Demo.cpp.vulkan.o ../build/libdgl-vulkan.a
+../build/tests/Demo.vulkan$(APP_EXT): ../build/tests/Demo.cpp.vulkan.o ../build/libdgl-vulkan.a
@echo "Linking Demo (OpenGL)"
$(SILENT)$(CXX) $^ $(LINK_FLAGS) $(DGL_SYSTEM_LIBS) $(VULKAN_LIBS) -o $@