Signed-off-by: falkTX <falktx@falktx.com>pull/401/head
| @@ -272,7 +272,10 @@ BASE_OPTS = -O2 -ffast-math -fdata-sections -ffunction-sections | |||||
| endif | endif | ||||
| ifeq ($(DEBUG),true) | ifeq ($(DEBUG),true) | ||||
| BASE_FLAGS += -DDEBUG -O0 -g -fsanitize=address | |||||
| BASE_FLAGS += -DDEBUG -O0 -g | |||||
| ifneq ($(HAIKU),true) | |||||
| BASE_FLAGS += -fsanitize=address | |||||
| endif | |||||
| LINK_OPTS = | LINK_OPTS = | ||||
| ifeq ($(WASM),true) | ifeq ($(WASM),true) | ||||
| LINK_OPTS += -sASSERTIONS=1 | LINK_OPTS += -sASSERTIONS=1 | ||||
| @@ -347,9 +350,11 @@ endif | |||||
| # --------------------------------------------------------------------------------------------------------------------- | # --------------------------------------------------------------------------------------------------------------------- | ||||
| # Check for required libraries | # Check for required libraries | ||||
| HAVE_CAIRO = $(shell $(PKG_CONFIG) --exists cairo && echo true) | |||||
| ifneq ($(HAIKU),true) | |||||
| HAVE_CAIRO = $(shell $(PKG_CONFIG) --exists cairo && echo true) | |||||
| endif | |||||
| ifeq ($(MACOS_OR_WASM_OR_WINDOWS),true) | |||||
| ifeq ($(HAIKU_OR_MACOS_OR_WASM_OR_WINDOWS),true) | |||||
| HAVE_OPENGL = true | HAVE_OPENGL = true | ||||
| else | else | ||||
| HAVE_OPENGL = $(shell $(PKG_CONFIG) --exists gl && echo true) | HAVE_OPENGL = $(shell $(PKG_CONFIG) --exists gl && echo true) | ||||
| @@ -454,8 +459,8 @@ ifeq ($(HAVE_OPENGL),true) | |||||
| DGL_FLAGS += -DHAVE_OPENGL | DGL_FLAGS += -DHAVE_OPENGL | ||||
| ifeq ($(HAIKU),true) | ifeq ($(HAIKU),true) | ||||
| OPENGL_FLAGS = $(shell $(PKG_CONFIG) --cflags gl) | |||||
| OPENGL_LIBS = $(shell $(PKG_CONFIG) --libs gl) | |||||
| OPENGL_FLAGS = | |||||
| OPENGL_LIBS = -lGL | |||||
| else ifeq ($(MACOS),true) | else ifeq ($(MACOS),true) | ||||
| OPENGL_FLAGS = -DGL_SILENCE_DEPRECATION=1 -Wno-deprecated-declarations | OPENGL_FLAGS = -DGL_SILENCE_DEPRECATION=1 -Wno-deprecated-declarations | ||||
| OPENGL_LIBS = -framework OpenGL | OPENGL_LIBS = -framework OpenGL | ||||
| @@ -481,7 +486,7 @@ endif | |||||
| # --------------------------------------------------------------------------------------------------------------------- | # --------------------------------------------------------------------------------------------------------------------- | ||||
| # Set Stub specific stuff | # Set Stub specific stuff | ||||
| ifeq ($(MACOS_OR_WASM_OR_WINDOWS),true) | |||||
| ifeq ($(HAIKU_OR_MACOS_OR_WASM_OR_WINDOWS),true) | |||||
| HAVE_STUB = true | HAVE_STUB = true | ||||
| else | else | ||||
| HAVE_STUB = $(HAVE_X11) | HAVE_STUB = $(HAVE_X11) | ||||
| @@ -540,7 +545,7 @@ endif | |||||
| # --------------------------------------------------------------------------------------------------------------------- | # --------------------------------------------------------------------------------------------------------------------- | ||||
| # Backwards-compatible HAVE_DGL | # Backwards-compatible HAVE_DGL | ||||
| ifeq ($(MACOS_OR_WASM_OR_WINDOWS),true) | |||||
| ifeq ($(HAIKU_OR_MACOS_OR_WASM_OR_WINDOWS),true) | |||||
| HAVE_DGL = true | HAVE_DGL = true | ||||
| else ifeq ($(HAVE_OPENGL),true) | else ifeq ($(HAVE_OPENGL),true) | ||||
| HAVE_DGL = $(HAVE_X11) | HAVE_DGL = $(HAVE_X11) | ||||
| @@ -1,28 +1,348 @@ | |||||
| /* | |||||
| Copyright 2012-2019 David Robillard <http://drobilla.net> | |||||
| Copyright 2019-2020 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 mac.cpp HaikuOS implementation. | |||||
| */ | |||||
| // Copyright 2012-2022 David Robillard <d@drobilla.net> | |||||
| // Copyright 2021-2022 Filipe Coelho <falktx@falktx.com> | |||||
| // SPDX-License-Identifier: ISC | |||||
| #include "haiku.h" | #include "haiku.h" | ||||
| #include "pugl/detail/implementation.h" | |||||
| #include "../pugl-upstream/src/internal.h" | |||||
| class PuglHaikuView : public BView | |||||
| { | |||||
| PuglView* const view; | |||||
| public: | |||||
| PuglHaikuView(PuglView* const v) | |||||
| : BView(NULL, B_FULL_UPDATE_ON_RESIZE|B_FRAME_EVENTS|B_NAVIGABLE|B_INPUT_METHOD_AWARE), | |||||
| view(v) {} | |||||
| protected: | |||||
| void GetPreferredSize(float* width, float* height) override | |||||
| { | |||||
| d_stdout("%s %i", __func__, __LINE__); | |||||
| if (width != nullptr) | |||||
| *width = view->frame.width; | |||||
| if (height != nullptr) | |||||
| *height = view->frame.height; | |||||
| d_stdout("%s %i", __func__, __LINE__); | |||||
| } | |||||
| }; | |||||
| class PuglHaikuWindow : public BWindow | |||||
| { | |||||
| PuglView* const view; | |||||
| public: | |||||
| PuglHaikuWindow(PuglView* const v) | |||||
| : BWindow(BRect(1.0f), "DPF-Window", B_TITLED_WINDOW, 0x0), | |||||
| view(v) {} | |||||
| // 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; | |||||
| // } | |||||
| }; | |||||
| BApplication* s_app = NULL; | |||||
| PuglWorldInternals* | |||||
| puglInitWorldInternals(const PuglWorldType type, const PuglWorldFlags flags) | |||||
| { | |||||
| if (!s_app) { | |||||
| status_t status; | |||||
| s_app = new BApplication("application/x-vnd.pugl-application", &status); | |||||
| if (status != B_OK) { | |||||
| delete s_app; | |||||
| return NULL; | |||||
| } | |||||
| } | |||||
| PuglWorldInternals* impl = | |||||
| (PuglWorldInternals*)calloc(1, sizeof(PuglWorldInternals)); | |||||
| impl->app = s_app; | |||||
| return impl; | |||||
| } | |||||
| void* | |||||
| puglGetNativeWorld(PuglWorld* const world) | |||||
| { | |||||
| return world->impl->app; | |||||
| } | |||||
| PuglInternals* | |||||
| puglInitViewInternals(PuglWorld* const world) | |||||
| { | |||||
| PuglInternals* impl = (PuglInternals*)calloc(1, sizeof(PuglInternals)); | |||||
| return impl; | |||||
| } | |||||
| PuglStatus | |||||
| puglRealize(PuglView* const view) | |||||
| { | |||||
| PuglInternals* const impl = view->impl; | |||||
| PuglStatus st = PUGL_SUCCESS; | |||||
| // Ensure that we're unrealized and that a reasonable backend has been set | |||||
| if (impl->view) { | |||||
| return PUGL_FAILURE; | |||||
| } | |||||
| if (!view->backend || !view->backend->configure) { | |||||
| return PUGL_BAD_BACKEND; | |||||
| } | |||||
| // Set the size to the default if it has not already been set | |||||
| if (view->frame.width <= 0.0 || view->frame.height <= 0.0) { | |||||
| const PuglViewSize defaultSize = view->sizeHints[PUGL_DEFAULT_SIZE]; | |||||
| if (!defaultSize.width || !defaultSize.height) { | |||||
| return PUGL_BAD_CONFIGURATION; | |||||
| } | |||||
| view->frame.width = defaultSize.width; | |||||
| view->frame.height = defaultSize.height; | |||||
| } | |||||
| // Center top-level windows if a position has not been set | |||||
| if (!view->parent && !view->frame.x && !view->frame.y) { | |||||
| // TODO | |||||
| } | |||||
| if (!view->parent) { | |||||
| impl->window = new PuglHaikuWindow(view); | |||||
| impl->window->Lock(); | |||||
| } | |||||
| impl->view = new PuglHaikuView(view); | |||||
| if (view->parent) { | |||||
| BView* const pview = (BView*)view->parent; | |||||
| pview->AddChild(impl->view); | |||||
| } else { | |||||
| impl->window->AddChild(impl->view); | |||||
| } | |||||
| // Configure and create the backend | |||||
| if ((st = view->backend->configure(view)) || (st = view->backend->create(view))) { | |||||
| view->backend->destroy(view); | |||||
| return st; | |||||
| } | |||||
| if (view->title) { | |||||
| puglSetWindowTitle(view, view->title); | |||||
| } | |||||
| if (view->transientParent) { | |||||
| puglSetTransientParent(view, view->transientParent); | |||||
| } | |||||
| puglDispatchSimpleEvent(view, PUGL_CREATE); | |||||
| if (impl->window) { | |||||
| impl->window->Unlock(); | |||||
| } | |||||
| return PUGL_SUCCESS; | |||||
| } | |||||
| PuglStatus | |||||
| puglShow(PuglView* const view) | |||||
| { | |||||
| PuglInternals* const impl = view->impl; | |||||
| if (impl->window) { | |||||
| impl->window->Show(); | |||||
| } else { | |||||
| impl->view->Show(); | |||||
| } | |||||
| return PUGL_SUCCESS; | |||||
| } | |||||
| PuglStatus | |||||
| puglHide(PuglView* const view) | |||||
| { | |||||
| PuglInternals* const impl = view->impl; | |||||
| if (impl->window) { | |||||
| impl->window->Hide(); | |||||
| } else { | |||||
| impl->view->Hide(); | |||||
| } | |||||
| return PUGL_SUCCESS; | |||||
| } | |||||
| void | |||||
| puglFreeViewInternals(PuglView* const view) | |||||
| { | |||||
| if (view && view->impl) { | |||||
| PuglInternals* const impl = view->impl; | |||||
| if (view->backend) { | |||||
| view->backend->destroy(view); | |||||
| } | |||||
| if (impl->view) { | |||||
| if (impl->window) { | |||||
| impl->window->RemoveChild(impl->view); | |||||
| } | |||||
| delete impl->view; | |||||
| delete impl->window; | |||||
| } | |||||
| free(impl); | |||||
| } | |||||
| } | |||||
| void | |||||
| puglFreeWorldInternals(PuglWorld* const world) | |||||
| { | |||||
| // if (world->impl->app != nullptr && world->impl->app->CountWindows() == 0) { | |||||
| // delete world->impl->app; | |||||
| // s_app = NULL; | |||||
| // } | |||||
| free(world->impl); | |||||
| } | |||||
| PuglStatus | |||||
| puglGrabFocus(PuglView*) | |||||
| { | |||||
| return PUGL_UNSUPPORTED; | |||||
| } | |||||
| double | |||||
| puglGetScaleFactor(const PuglView* const view) | |||||
| { | |||||
| return 1.0; | |||||
| } | |||||
| double | |||||
| puglGetTime(const PuglWorld* const world) | |||||
| { | |||||
| struct timespec ts; | |||||
| clock_gettime(CLOCK_MONOTONIC, &ts); | |||||
| return ((double)ts.tv_sec + (double)ts.tv_nsec / 1000000000.0) - | |||||
| world->startTime; | |||||
| } | |||||
| PuglStatus | |||||
| puglUpdate(PuglWorld* const world, const double timeout) | |||||
| { | |||||
| return PUGL_UNSUPPORTED; | |||||
| } | |||||
| PuglStatus | |||||
| puglPostRedisplay(PuglView* const view) | |||||
| { | |||||
| return PUGL_UNSUPPORTED; | |||||
| } | |||||
| PuglStatus | |||||
| puglPostRedisplayRect(PuglView* const view, const PuglRect rect) | |||||
| { | |||||
| return PUGL_UNSUPPORTED; | |||||
| } | |||||
| PuglNativeView | |||||
| puglGetNativeView(PuglView* const view) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| PuglStatus | |||||
| puglSetWindowTitle(PuglView* const view, const char* const title) | |||||
| { | |||||
| puglSetString(&view->title, title); | |||||
| return PUGL_UNSUPPORTED; | |||||
| } | |||||
| PuglStatus | |||||
| puglSetSizeHint(PuglView* const view, | |||||
| const PuglSizeHint hint, | |||||
| const PuglSpan width, | |||||
| const PuglSpan height) | |||||
| { | |||||
| view->sizeHints[hint].width = width; | |||||
| view->sizeHints[hint].height = height; | |||||
| return PUGL_SUCCESS; | |||||
| } | |||||
| PuglStatus | |||||
| puglStartTimer(PuglView* const view, const uintptr_t id, const double timeout) | |||||
| { | |||||
| return PUGL_UNSUPPORTED; | |||||
| } | |||||
| PuglStatus | |||||
| puglStopTimer(PuglView* const view, const uintptr_t id) | |||||
| { | |||||
| return PUGL_UNSUPPORTED; | |||||
| } | |||||
| PuglStatus | |||||
| puglPaste(PuglView* const view) | |||||
| { | |||||
| return PUGL_UNSUPPORTED; | |||||
| } | |||||
| PuglStatus | |||||
| puglAcceptOffer(PuglView* const view, | |||||
| const PuglDataOfferEvent* const offer, | |||||
| const uint32_t typeIndex) | |||||
| { | |||||
| return PUGL_UNSUPPORTED; | |||||
| } | |||||
| uint32_t | |||||
| puglGetNumClipboardTypes(const PuglView* const view) | |||||
| { | |||||
| return 0u; | |||||
| } | |||||
| const char* | |||||
| puglGetClipboardType(const PuglView* const view, const uint32_t typeIndex) | |||||
| { | |||||
| return NULL; | |||||
| } | |||||
| const void* | |||||
| puglGetClipboard(PuglView* const view, | |||||
| const uint32_t typeIndex, | |||||
| size_t* const len) | |||||
| { | |||||
| return NULL; | |||||
| } | |||||
| PuglStatus | |||||
| puglSetClipboard(PuglView* const view, | |||||
| const char* const type, | |||||
| const void* const data, | |||||
| const size_t len) | |||||
| { | |||||
| return PUGL_FAILURE; | |||||
| } | |||||
| PuglStatus | |||||
| puglSetCursor(PuglView* const view, const PuglCursor cursor) | |||||
| { | |||||
| return PUGL_FAILURE; | |||||
| } | |||||
| PuglStatus | |||||
| puglSetTransientParent(PuglView* const view, const PuglNativeView parent) | |||||
| { | |||||
| return PUGL_FAILURE; | |||||
| } | |||||
| PuglStatus | |||||
| puglSetPosition(PuglView* const view, const int x, const int y) | |||||
| { | |||||
| return PUGL_FAILURE; | |||||
| } | |||||
| #if 0 | |||||
| PuglStatus | PuglStatus | ||||
| puglGrabFocus(PuglView* view) | puglGrabFocus(PuglView* view) | ||||
| { | { | ||||
| @@ -79,3 +399,4 @@ void setVisible(const bool yesNo) | |||||
| bView->Hide(); | bView->Hide(); | ||||
| } | } | ||||
| } | } | ||||
| #endif | |||||
| @@ -1,35 +1,25 @@ | |||||
| /* | |||||
| Copyright 2012-2019 David Robillard <http://drobilla.net> | |||||
| Copyright 2019-2020 Filipe Coelho <falktx@falktx.com> | |||||
| // Copyright 2012-2022 David Robillard <d@drobilla.net> | |||||
| // Copyright 2021-2022 Filipe Coelho <falktx@falktx.com> | |||||
| // SPDX-License-Identifier: ISC | |||||
| 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. | |||||
| #ifndef PUGL_SRC_HAIKU_H | |||||
| #define PUGL_SRC_HAIKU_H | |||||
| 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 haiku.h Shared definitions for HaikuOS implementation. | |||||
| */ | |||||
| #include "../pugl-upstream/src/types.h" | |||||
| #include "pugl/pugl.h" | #include "pugl/pugl.h" | ||||
| #include <Application.h> | #include <Application.h> | ||||
| #include <Window.h> | #include <Window.h> | ||||
| // using? interface/ | |||||
| struct PuglWorldInternalsImpl { | struct PuglWorldInternalsImpl { | ||||
| BApplication* app; | |||||
| BApplication* app; | |||||
| }; | }; | ||||
| struct PuglInternalsImpl { | struct PuglInternalsImpl { | ||||
| BViewType* view; | |||||
| BWindow* window; | |||||
| PuglSurface* surface; | |||||
| BView* view; | |||||
| BWindow* window; | |||||
| }; | }; | ||||
| #endif // PUGL_SRC_HAIKU_H | |||||
| @@ -0,0 +1,87 @@ | |||||
| // Copyright 2012-2022 David Robillard <d@drobilla.net> | |||||
| // Copyright 2021-2022 Filipe Coelho <falktx@falktx.com> | |||||
| // SPDX-License-Identifier: ISC | |||||
| #include "../pugl-upstream/src/stub.h" | |||||
| #include "haiku.h" | |||||
| #include "pugl/pugl.h" | |||||
| #include <stdio.h> | |||||
| #include <stdlib.h> | |||||
| #include <GL/gl.h> | |||||
| #include <opengl/GLView.h> | |||||
| typedef struct { | |||||
| BGLView* view; | |||||
| } PuglHaikuGlSurface; | |||||
| static PuglStatus | |||||
| puglHaikuGlConfigure(PuglView* view) | |||||
| { | |||||
| PuglInternals* const impl = view->impl; | |||||
| PuglHaikuGlSurface* const surface = | |||||
| (PuglHaikuGlSurface*)calloc(1, sizeof(PuglHaikuGlSurface)); | |||||
| impl->surface = surface; | |||||
| return PUGL_SUCCESS; | |||||
| } | |||||
| PUGL_WARN_UNUSED_RESULT | |||||
| static PuglStatus | |||||
| puglHaikuGlEnter(PuglView* const view, const PuglExposeEvent* PUGL_UNUSED(expose)) | |||||
| { | |||||
| PuglHaikuGlSurface* const surface = (PuglHaikuGlSurface*)view->impl->surface; | |||||
| if (!surface || !surface->view) { | |||||
| return PUGL_FAILURE; | |||||
| } | |||||
| surface->view->LockGL(); | |||||
| return PUGL_SUCCESS; | |||||
| } | |||||
| PUGL_WARN_UNUSED_RESULT | |||||
| static PuglStatus | |||||
| puglHaikuGlLeave(PuglView* const view, const PuglExposeEvent* const expose) | |||||
| { | |||||
| PuglHaikuGlSurface* const surface = (PuglHaikuGlSurface*)view->impl->surface; | |||||
| if (!surface || !surface->view) { | |||||
| return PUGL_FAILURE; | |||||
| } | |||||
| if (expose) | |||||
| surface->view->SwapBuffers(); | |||||
| surface->view->UnlockGL(); | |||||
| return PUGL_SUCCESS; | |||||
| } | |||||
| static PuglStatus | |||||
| puglHaikuGlCreate(PuglView* view) | |||||
| { | |||||
| return PUGL_SUCCESS; | |||||
| } | |||||
| static void | |||||
| puglHaikuGlDestroy(PuglView* view) | |||||
| { | |||||
| PuglHaikuGlSurface* surface = (PuglHaikuGlSurface*)view->impl->surface; | |||||
| if (surface) { | |||||
| free(surface); | |||||
| view->impl->surface = NULL; | |||||
| } | |||||
| } | |||||
| const PuglBackend* | |||||
| puglGlBackend(void) | |||||
| { | |||||
| static const PuglBackend backend = {puglHaikuGlConfigure, | |||||
| puglHaikuGlCreate, | |||||
| puglHaikuGlDestroy, | |||||
| puglHaikuGlEnter, | |||||
| puglHaikuGlLeave, | |||||
| puglStubGetContext}; | |||||
| return &backend; | |||||
| } | |||||
| @@ -0,0 +1,24 @@ | |||||
| // Copyright 2012-2022 David Robillard <d@drobilla.net> | |||||
| // Copyright 2021-2022 Filipe Coelho <falktx@falktx.com> | |||||
| // SPDX-License-Identifier: ISC | |||||
| #include "pugl/stub.h" | |||||
| #include "../pugl-upstream/src/stub.h" | |||||
| #include "pugl/pugl.h" | |||||
| const PuglBackend* | |||||
| puglStubBackend(void) | |||||
| { | |||||
| static const PuglBackend backend = { | |||||
| puglStubConfigure, | |||||
| puglStubCreate, | |||||
| puglStubDestroy, | |||||
| puglStubEnter, | |||||
| puglStubLeave, | |||||
| puglStubGetContext, | |||||
| }; | |||||
| return &backend; | |||||
| } | |||||
| @@ -41,7 +41,7 @@ puglWasmGlGetAttrib(const EGLDisplay display, | |||||
| static PuglStatus | static PuglStatus | ||||
| puglWasmGlConfigure(PuglView* view) | puglWasmGlConfigure(PuglView* view) | ||||
| { | { | ||||
| PuglInternals* const impl = view->impl; | |||||
| PuglInternals* const impl = view->impl; | |||||
| const EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); | const EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); | ||||
| @@ -37,7 +37,14 @@ | |||||
| #include <cstring> | #include <cstring> | ||||
| #include <ctime> | #include <ctime> | ||||
| #if defined(DISTRHO_OS_MAC) | |||||
| #if defined(DISTRHO_OS_HAIKU) | |||||
| # include <Application.h> | |||||
| # include <Window.h> | |||||
| # ifdef DGL_OPENGL | |||||
| # include <GL/gl.h> | |||||
| # include <opengl/GLView.h> | |||||
| # endif | |||||
| #elif defined(DISTRHO_OS_MAC) | |||||
| # import <Cocoa/Cocoa.h> | # import <Cocoa/Cocoa.h> | ||||
| # include <dlfcn.h> | # include <dlfcn.h> | ||||
| # include <mach/mach_time.h> | # include <mach/mach_time.h> | ||||
| @@ -119,7 +126,13 @@ START_NAMESPACE_DGL | |||||
| // -------------------------------------------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------------------------------------------- | ||||
| #if defined(DISTRHO_OS_MAC) | |||||
| #if defined(DISTRHO_OS_HAIKU) | |||||
| # include "pugl-extra/haiku.cpp" | |||||
| # include "pugl-extra/haiku_stub.cpp" | |||||
| # ifdef DGL_OPENGL | |||||
| # include "pugl-extra/haiku_gl.cpp" | |||||
| # endif | |||||
| #elif defined(DISTRHO_OS_MAC) | |||||
| # ifndef DISTRHO_MACOS_NAMESPACE_MACRO | # ifndef DISTRHO_MACOS_NAMESPACE_MACRO | ||||
| # define DISTRHO_MACOS_NAMESPACE_MACRO_HELPER(NS, SEP, INTERFACE) NS ## SEP ## INTERFACE | # define DISTRHO_MACOS_NAMESPACE_MACRO_HELPER(NS, SEP, INTERFACE) NS ## SEP ## INTERFACE | ||||
| # define DISTRHO_MACOS_NAMESPACE_MACRO(NS, INTERFACE) DISTRHO_MACOS_NAMESPACE_MACRO_HELPER(NS, _, INTERFACE) | # define DISTRHO_MACOS_NAMESPACE_MACRO(NS, INTERFACE) DISTRHO_MACOS_NAMESPACE_MACRO_HELPER(NS, _, INTERFACE) | ||||
| @@ -237,7 +250,8 @@ void puglSetMatchingBackendForCurrentBuild(PuglView* const view) | |||||
| void puglRaiseWindow(PuglView* const view) | void puglRaiseWindow(PuglView* const view) | ||||
| { | { | ||||
| #if defined(DISTRHO_OS_MAC) | |||||
| #if defined(DISTRHO_OS_HAIKU) | |||||
| #elif defined(DISTRHO_OS_MAC) | |||||
| if (NSWindow* const window = view->impl->window ? view->impl->window | if (NSWindow* const window = view->impl->window ? view->impl->window | ||||
| : [view->impl->wrapperView window]) | : [view->impl->wrapperView window]) | ||||
| [window orderFrontRegardless]; | [window orderFrontRegardless]; | ||||
| @@ -257,7 +271,10 @@ void puglRaiseWindow(PuglView* const view) | |||||
| double puglGetScaleFactorFromParent(const PuglView* const view) | double puglGetScaleFactorFromParent(const PuglView* const view) | ||||
| { | { | ||||
| const PuglNativeView parent = view->parent ? view->parent : view->transientParent ? view->transientParent : 0; | const PuglNativeView parent = view->parent ? view->parent : view->transientParent ? view->transientParent : 0; | ||||
| #if defined(DISTRHO_OS_MAC) | |||||
| #if defined(DISTRHO_OS_HAIKU) | |||||
| // TODO | |||||
| return 1.0; | |||||
| #elif defined(DISTRHO_OS_MAC) | |||||
| // some of these can return 0 as backingScaleFactor, pick the most relevant valid one | // some of these can return 0 as backingScaleFactor, pick the most relevant valid one | ||||
| const NSWindow* possibleWindows[] = { | const NSWindow* possibleWindows[] = { | ||||
| parent != 0 ? [(NSView*)parent window] : nullptr, | parent != 0 ? [(NSView*)parent window] : nullptr, | ||||
| @@ -296,7 +313,8 @@ PuglStatus puglSetGeometryConstraints(PuglView* const view, const uint width, co | |||||
| view->sizeHints[PUGL_FIXED_ASPECT].height = height; | view->sizeHints[PUGL_FIXED_ASPECT].height = height; | ||||
| } | } | ||||
| #if defined(DISTRHO_OS_MAC) | |||||
| #if defined(DISTRHO_OS_HAIKU) | |||||
| #elif defined(DISTRHO_OS_MAC) | |||||
| if (view->impl->window) | if (view->impl->window) | ||||
| { | { | ||||
| PuglStatus status; | PuglStatus status; | ||||
| @@ -328,7 +346,8 @@ void puglSetResizable(PuglView* const view, const bool resizable) | |||||
| { | { | ||||
| puglSetViewHint(view, PUGL_RESIZABLE, resizable ? PUGL_TRUE : PUGL_FALSE); | puglSetViewHint(view, PUGL_RESIZABLE, resizable ? PUGL_TRUE : PUGL_FALSE); | ||||
| #if defined(DISTRHO_OS_MAC) | |||||
| #if defined(DISTRHO_OS_HAIKU) | |||||
| #elif defined(DISTRHO_OS_MAC) | |||||
| if (PuglWindow* const window = view->impl->window) | if (PuglWindow* const window = view->impl->window) | ||||
| { | { | ||||
| const uint style = (NSClosableWindowMask | NSTitledWindowMask | NSMiniaturizableWindowMask) | const uint style = (NSClosableWindowMask | NSTitledWindowMask | NSMiniaturizableWindowMask) | ||||
| @@ -361,7 +380,8 @@ PuglStatus puglSetSizeAndDefault(PuglView* view, uint width, uint height) | |||||
| view->sizeHints[PUGL_DEFAULT_SIZE].width = view->frame.width = static_cast<PuglSpan>(width); | view->sizeHints[PUGL_DEFAULT_SIZE].width = view->frame.width = static_cast<PuglSpan>(width); | ||||
| view->sizeHints[PUGL_DEFAULT_SIZE].height = view->frame.height = static_cast<PuglSpan>(height); | view->sizeHints[PUGL_DEFAULT_SIZE].height = view->frame.height = static_cast<PuglSpan>(height); | ||||
| #if defined(DISTRHO_OS_MAC) | |||||
| #if defined(DISTRHO_OS_HAIKU) | |||||
| #elif defined(DISTRHO_OS_MAC) | |||||
| // mostly matches upstream pugl, simplified | // mostly matches upstream pugl, simplified | ||||
| PuglInternals* const impl = view->impl; | PuglInternals* const impl = view->impl; | ||||
| @@ -456,7 +476,11 @@ void puglFallbackOnResize(PuglView* const view) | |||||
| // -------------------------------------------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------------------------------------------- | ||||
| #if defined(DISTRHO_OS_MAC) | |||||
| #if defined(DISTRHO_OS_HAIKU) | |||||
| // -------------------------------------------------------------------------------------------------------------------- | |||||
| #elif defined(DISTRHO_OS_MAC) | |||||
| // -------------------------------------------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------------------------------------------- | ||||
| // macOS specific, add another view's window as child | // macOS specific, add another view's window as child | ||||
| @@ -73,7 +73,11 @@ void puglOnDisplayPrepare(PuglView* view); | |||||
| // DGL specific, build-specific fallback resize | // DGL specific, build-specific fallback resize | ||||
| void puglFallbackOnResize(PuglView* view); | void puglFallbackOnResize(PuglView* view); | ||||
| #if defined(DISTRHO_OS_MAC) | |||||
| #if defined(DISTRHO_OS_HAIKU) | |||||
| // nothing here yet | |||||
| #elif defined(DISTRHO_OS_MAC) | |||||
| // macOS specific, add another view's window as child | // macOS specific, add another view's window as child | ||||
| PuglStatus puglMacOSAddChildWindow(PuglView* view, PuglView* child); | PuglStatus puglMacOSAddChildWindow(PuglView* view, PuglView* child); | ||||