Mercurial > hg > pub > prymula > com
diff DPF-Prymula-audioplugins/dpf/dgl/src/pugl-extra/haiku.cpp @ 3:84e66ea83026
DPF-Prymula-audioplugins-0.231015-2
author | prymula <prymula76@outlook.com> |
---|---|
date | Mon, 16 Oct 2023 21:53:34 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DPF-Prymula-audioplugins/dpf/dgl/src/pugl-extra/haiku.cpp Mon Oct 16 21:53:34 2023 +0200 @@ -0,0 +1,402 @@ +// Copyright 2012-2022 David Robillard <d@drobilla.net> +// Copyright 2021-2022 Filipe Coelho <falktx@falktx.com> +// SPDX-License-Identifier: ISC + +#include "haiku.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 +puglGrabFocus(PuglView* view) +{ + view->impl->bView->MakeFocus(true); + return PUGL_SUCCESS; +} + +// extras follow + +void +puglRaiseWindow(PuglView* view) +{ +} + +void +puglSetWindowSize(PuglView* view, unsigned int width, unsigned int height) +{ + bView->ResizeTo(width, height); + + if (bWindow != nullptr && bWindow->LockLooper()) + { + bWindow->MoveTo(50, 50); + bWindow->ResizeTo(width, height); + + if (! forced) + bWindow->Flush(); + + bWindow->UnlockLooper(); + } + // TODO resizable +} + +void setVisible(const bool yesNo) +{ + if (bWindow != nullptr) + { + if (bWindow->LockLooper()) + { + if (yesNo) + bWindow->Show(); + else + bWindow->Hide(); + + // TODO use flush? + bWindow->Sync(); + bWindow->UnlockLooper(); + } + } + else + { + if (yesNo) + bView->Show(); + else + bView->Hide(); + } +} +#endif