Mercurial > hg > pub > prymula > com
diff DPF-Prymula-audioplugins/dpf/dgl/src/WindowPrivateData.hpp @ 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/WindowPrivateData.hpp Mon Oct 16 21:53:34 2023 +0200 @@ -0,0 +1,205 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2022 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. + * + * THE 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. + */ + +#ifndef DGL_WINDOW_PRIVATE_DATA_HPP_INCLUDED +#define DGL_WINDOW_PRIVATE_DATA_HPP_INCLUDED + +#include "../Window.hpp" +#include "../Widget.hpp" +#include "ApplicationPrivateData.hpp" + +#include "pugl.hpp" + +#include <list> + +START_NAMESPACE_DGL + +class TopLevelWidget; + +// ----------------------------------------------------------------------- + +struct Window::PrivateData : IdleCallback { + /** Reference to the DGL Application class this (private data) window associates with. */ + Application& app; + + /** Direct access to the DGL Application private data where we registers ourselves in. */ + Application::PrivateData* const appData; + + /** Pointer to the the DGL Window class that this private data belongs to. */ + Window* const self; + + /** Pugl view instance. */ + PuglView* view; + + /** Reserved space for graphics context. */ + mutable uint8_t graphicsContext[sizeof(void*)]; + + /** The top-level widgets associated with this Window. */ + std::list<TopLevelWidget*> topLevelWidgets; + + /** Whether this Window is closed (not visible or counted in the Application it is tied to). + Defaults to true unless embed (embed windows are never closed). */ + bool isClosed; + + /** Whether this Window is currently visible/mapped. Defaults to false. */ + bool isVisible; + + /** Whether this Window is embed into another (usually not DGL-controlled) Window. */ + const bool isEmbed; + + /** Whether to ignore resize requests and feed them into the host instead. used for VST3 */ + const bool usesSizeRequest; + + /** Scale factor to report to widgets on request, purely informational. */ + double scaleFactor; + + /** Automatic scaling to apply on widgets, implemented internally. */ + bool autoScaling; + double autoScaleFactor; + + /** Pugl geometry constraints access. */ + uint minWidth, minHeight; + bool keepAspectRatio; + + /** Whether to ignore idle callback requests, useful for temporary windows. */ + bool ignoreIdleCallbacks; + + /** Whether we are waiting to receive clipboard data, ignoring some events in the process. */ + bool waitingForClipboardData; + bool waitingForClipboardEvents; + + /** The type id returned by the last onClipboardDataOffer call. */ + uint32_t clipboardTypeId; + + /** Render to a picture file when non-null, automatically free+unset after saving. */ + char* filenameToRenderInto; + +#ifndef DGL_FILE_BROWSER_DISABLED + /** Handle for file browser dialog operations. */ + DGL_NAMESPACE::FileBrowserHandle fileBrowserHandle; +#endif + + /** Modal window setup. */ + struct Modal { + PrivateData* parent; // parent of this window (so we can become modal) + PrivateData* child; // child window to give focus to when modal mode is enabled + bool enabled; // wherever modal mode is enabled (only possible if parent != null) + + /** Constructor for a non-modal window. */ + Modal() noexcept + : parent(nullptr), + child(nullptr), + enabled(false) {} + + /** Constructor for a modal window (with a parent). */ + Modal(PrivateData* const p) noexcept + : parent(p), + child(nullptr), + enabled(false) {} + + /** Destructor. */ + ~Modal() noexcept + { + DISTRHO_SAFE_ASSERT(! enabled); + } + + DISTRHO_DECLARE_NON_COPYABLE(Modal) + DISTRHO_PREVENT_HEAP_ALLOCATION + } modal; + + /** Constructor for a regular, standalone window. */ + explicit PrivateData(Application& app, Window* self); + + /** Constructor for a modal window. */ + explicit PrivateData(Application& app, Window* self, PrivateData* ppData); + + /** Constructor for an embed Window, with a few extra hints from the host side. */ + explicit PrivateData(Application& app, Window* self, uintptr_t parentWindowHandle, double scaling, bool resizable); + + /** Constructor for an embed Window, with a few extra hints from the host side. */ + explicit PrivateData(Application& app, Window* self, uintptr_t parentWindowHandle, + uint width, uint height, double scaling, bool resizable, bool isVST3); + + /** Destructor. */ + ~PrivateData() override; + + /** Helper initialization function called at the end of all this class constructors. */ + void initPre(uint width, uint height, bool resizable); + /** Helper initialization function called on the Window constructor after we are done. */ + bool initPost(); + + /** Hide window and notify application of a window close event. + * Does nothing if window is embed (that is, not standalone). + * The application event-loop will stop when all windows have been closed. + * + * @note It is possible to hide the window while not stopping the event-loop. + * A closed window is always hidden, but the reverse is not always true. + */ + void close(); + + void show(); + void hide(); + + void focus(); + + void setResizable(bool resizable); + + const GraphicsContext& getGraphicsContext() const noexcept; + + // idle callback stuff + void idleCallback() override; + bool addIdleCallback(IdleCallback* callback, uint timerFrequencyInMs); + bool removeIdleCallback(IdleCallback* callback); + +#ifndef DGL_FILE_BROWSER_DISABLED + // file handling + bool openFileBrowser(const DGL_NAMESPACE::FileBrowserOptions& options); +#endif + + static void renderToPicture(const char* filename, const GraphicsContext& context, uint width, uint height); + + // modal handling + void startModal(); + void stopModal(); + void runAsModal(bool blockWait); + + // pugl events + void onPuglConfigure(double width, double height); + void onPuglExpose(); + void onPuglClose(); + void onPuglFocus(bool focus, CrossingMode mode); + void onPuglKey(const Widget::KeyboardEvent& ev); + void onPuglText(const Widget::CharacterInputEvent& ev); + void onPuglMouse(const Widget::MouseEvent& ev); + void onPuglMotion(const Widget::MotionEvent& ev); + void onPuglScroll(const Widget::ScrollEvent& ev); + + // clipboard related handling + const void* getClipboard(size_t& dataSize); + uint32_t onClipboardDataOffer(); + void onClipboardData(uint32_t typeId); + + // Pugl event handling entry point + static PuglStatus puglEventCallback(PuglView* view, const PuglEvent* event); + + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PrivateData) +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL + +#endif // DGL_WINDOW_PRIVATE_DATA_HPP_INCLUDED