|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 |
- //-----------------------------------------------------------------------------
- // Project : SDK Core
- //
- // Category : SDK GUI Interfaces
- // Filename : pluginterfaces/gui/iplugview.h
- // Created by : Steinberg, 12/2007
- // Description : Plug-in User Interface
- //
- //-----------------------------------------------------------------------------
- // This file is part of a Steinberg SDK. It is subject to the license terms
- // in the LICENSE file found in the top-level directory of this distribution
- // and at www.steinberg.net/sdklicenses.
- // No part of the SDK, including this file, may be copied, modified, propagated,
- // or distributed except according to the terms contained in the LICENSE file.
- //-----------------------------------------------------------------------------
-
- #pragma once
-
- #include "pluginterfaces/base/funknown.h"
- #include "pluginterfaces/base/typesizecheck.h"
-
- namespace Steinberg {
-
- class IPlugFrame;
-
- //------------------------------------------------------------------------
- /*! \defgroup pluginGUI Graphical User Interface
- */
-
- //------------------------------------------------------------------------
- /** Graphical rectangle structure. Used with IPlugView.
- \ingroup pluginGUI
- */
- //------------------------------------------------------------------------
- struct ViewRect
- {
- ViewRect (int32 l = 0, int32 t = 0, int32 r = 0, int32 b = 0)
- : left (l), top (t), right (r), bottom (b)
- {
- }
-
- int32 left;
- int32 top;
- int32 right;
- int32 bottom;
-
- //--- ---------------------------------------------------------------------
- int32 getWidth () const { return right - left; }
- int32 getHeight () const { return bottom - top; }
- };
-
- SMTG_TYPE_SIZE_CHECK (ViewRect, 16, 16, 16, 16)
-
- //------------------------------------------------------------------------
- /** \defgroup platformUIType Platform UI Types
- \ingroup pluginGUI
- List of Platform UI types for IPlugView. This list is used to match the GUI-System between
- the host and a Plug-in in case that an OS provides multiple GUI-APIs.
- */
- /*@{*/
- /** The parent parameter in IPlugView::attached() is a HWND handle.
- * You should attach a child window to it. */
- const FIDString kPlatformTypeHWND = "HWND"; ///< HWND handle. (Microsoft Windows)
-
- /** The parent parameter in IPlugView::attached() is a WindowRef.
- * You should attach a HIViewRef to the content view of the window. */
- const FIDString kPlatformTypeHIView = "HIView"; ///< HIViewRef. (Mac OS X)
-
- /** The parent parameter in IPlugView::attached() is a NSView pointer.
- * You should attach a NSView to it. */
- const FIDString kPlatformTypeNSView = "NSView"; ///< NSView pointer. (Mac OS X)
-
- /** The parent parameter in IPlugView::attached() is a UIView pointer.
- * You should attach an UIView to it. */
- const FIDString kPlatformTypeUIView = "UIView"; ///< UIView pointer. (iOS)
-
- /** The parent parameter in IPlugView::attached() is a X11 Window supporting XEmbed.
- * You should attach a Window to it that supports the XEmbed extension.
- * See https://standards.freedesktop.org/xembed-spec/xembed-spec-latest.html */
- const FIDString kPlatformTypeX11EmbedWindowID = "X11EmbedWindowID"; ///< X11 Window ID. (X11)
-
- /*@}*/
- //------------------------------------------------------------------------
-
- //------------------------------------------------------------------------
- /** Plug-in definition of a view.
- \ingroup pluginGUI vstIPlug vst300
- - [plug imp]
- - [released: 3.0.0]
-
- \par Sizing of a view
- Usually the size of a Plug-in view is fixed. But both the host and the Plug-in can cause
- a view to be resized:
- \n
- - <b> Host </b> : If IPlugView::canResize () returns kResultTrue the host will setup the window
- so that the user can resize it. While the user resizes the window
- IPlugView::checkSizeConstraint () is called, allowing the Plug-in to change the size to a valid
- rect. The host then resizes the window to this rect and has to call IPlugView::onSize ().
- \n
- \n
- - <b> Plug-in </b> : The Plug-in can call IPlugFrame::resizeView () and cause the host to resize the
- window.
- Afterwards in the same callstack the host has to call IPlugView::onSize () if a resize is needed (size was changed).
- Note that if the host calls IPlugView::getSize () before calling IPlugView::onSize () (if needed),
- it will get the current (old) size not the wanted one!!
- Here the calling sequence:
- * plug-in->host: IPlugFrame::resizeView (newSize)
- * host->plug-in (optional): IPlugView::getSize () returns the currentSize (not the newSize)!
- * host->plug-in: if newSize is different from the current size: IPlugView::onSize (newSize)
- * host->plug-in (optional): IPlugView::getSize () returns the newSize
- \n
- <b>Please only resize the platform representation of the view when IPlugView::onSize () is
- called.</b>
-
- \par Keyboard handling
- The Plug-in view receives keyboard events from the host. A view implementation must not handle
- keyboard events by the means of platform callbacks, but let the host pass them to the view. The host
- depends on a proper return value when IPlugView::onKeyDown is called, otherwise the Plug-in view may
- cause a malfunction of the host's key command handling!
-
- \see IPlugFrame, \ref platformUIType
- */
- //------------------------------------------------------------------------
- class IPlugView : public FUnknown
- {
- public:
- //------------------------------------------------------------------------
- /** Is Platform UI Type supported
- \param type : IDString of \ref platformUIType */
- virtual tresult PLUGIN_API isPlatformTypeSupported (FIDString type) = 0;
-
- /** The parent window of the view has been created, the (platform) representation of the view
- should now be created as well.
- Note that the parent is owned by the caller and you are not allowed to alter it in any way
- other than adding your own views.
- Note that in this call the Plug-in could call a IPlugFrame::resizeView ()!
- \param parent : platform handle of the parent window or view
- \param type : \ref platformUIType which should be created */
- virtual tresult PLUGIN_API attached (void* parent, FIDString type) = 0;
-
- /** The parent window of the view is about to be destroyed.
- You have to remove all your own views from the parent window or view. */
- virtual tresult PLUGIN_API removed () = 0;
-
- /** Handling of mouse wheel. */
- virtual tresult PLUGIN_API onWheel (float distance) = 0;
-
- /** Handling of keyboard events : Key Down.
- \param key : unicode code of key
- \param keyCode : virtual keycode for non ascii keys - see \ref VirtualKeyCodes in keycodes.h
- \param modifiers : any combination of modifiers - see \ref KeyModifier in keycodes.h
- \return kResultTrue if the key is handled, otherwise kResultFalse. \n
- <b> Please note that kResultTrue must only be returned if the key has really been
- handled. </b> Otherwise key command handling of the host might be blocked! */
- virtual tresult PLUGIN_API onKeyDown (char16 key, int16 keyCode, int16 modifiers) = 0;
-
- /** Handling of keyboard events : Key Up.
- \param key : unicode code of key
- \param keyCode : virtual keycode for non ascii keys - see \ref VirtualKeyCodes in keycodes.h
- \param modifiers : any combination of KeyModifier - see \ref KeyModifier in keycodes.h
- \return kResultTrue if the key is handled, otherwise return kResultFalse. */
- virtual tresult PLUGIN_API onKeyUp (char16 key, int16 keyCode, int16 modifiers) = 0;
-
- /** Returns the size of the platform representation of the view. */
- virtual tresult PLUGIN_API getSize (ViewRect* size) = 0;
-
- /** Resizes the platform representation of the view to the given rect. Note that if the Plug-in
- * requests a resize (IPlugFrame::resizeView ()) onSize has to be called afterward. */
- virtual tresult PLUGIN_API onSize (ViewRect* newSize) = 0;
-
- /** Focus changed message. */
- virtual tresult PLUGIN_API onFocus (TBool state) = 0;
-
- /** Sets IPlugFrame object to allow the Plug-in to inform the host about resizing. */
- virtual tresult PLUGIN_API setFrame (IPlugFrame* frame) = 0;
-
- /** Is view sizable by user. */
- virtual tresult PLUGIN_API canResize () = 0;
-
- /** On live resize this is called to check if the view can be resized to the given rect, if not
- * adjust the rect to the allowed size. */
- virtual tresult PLUGIN_API checkSizeConstraint (ViewRect* rect) = 0;
- //------------------------------------------------------------------------
- static const FUID iid;
- };
-
- DECLARE_CLASS_IID (IPlugView, 0x5BC32507, 0xD06049EA, 0xA6151B52, 0x2B755B29)
-
- //------------------------------------------------------------------------
- /** Callback interface passed to IPlugView.
- \ingroup pluginGUI vstIHost vst300
- - [host imp]
- - [released: 3.0.0]
- - [mandatory]
-
- Enables a Plug-in to resize the view and cause the host to resize the window.
- */
- //------------------------------------------------------------------------
- class IPlugFrame : public FUnknown
- {
- public:
- //------------------------------------------------------------------------
- /** Called to inform the host about the resize of a given view.
- * Afterwards the host has to call IPlugView::onSize (). */
- virtual tresult PLUGIN_API resizeView (IPlugView* view, ViewRect* newSize) = 0;
- //------------------------------------------------------------------------
- static const FUID iid;
- };
-
- DECLARE_CLASS_IID (IPlugFrame, 0x367FAF01, 0xAFA94693, 0x8D4DA2A0, 0xED0882A3)
-
- #if SMTG_OS_LINUX
- //------------------------------------------------------------------------
- namespace Linux {
-
- using TimerInterval = uint64;
- using FileDescriptor = int;
-
- //------------------------------------------------------------------------
- /** Linux event handler interface
- \ingroup pluginGUI vst368
- - [plug imp]
- - [released: 3.6.8]
- \see IRunLoop
- */
- class IEventHandler : public FUnknown
- {
- public:
- virtual void PLUGIN_API onFDIsSet (FileDescriptor fd) = 0;
- //------------------------------------------------------------------------
- static const FUID iid;
- };
- DECLARE_CLASS_IID (IEventHandler, 0x561E65C9, 0x13A0496F, 0x813A2C35, 0x654D7983)
-
- //------------------------------------------------------------------------
- /** Linux timer handler interface
- \ingroup pluginGUI vst368
- - [plug imp]
- - [released: 3.6.8]
- \see IRunLoop
- */
- class ITimerHandler : public FUnknown
- {
- public:
- virtual void PLUGIN_API onTimer () = 0;
- //------------------------------------------------------------------------
- static const FUID iid;
- };
- DECLARE_CLASS_IID (ITimerHandler, 0x10BDD94F, 0x41424774, 0x821FAD8F, 0xECA72CA9)
-
- //------------------------------------------------------------------------
- /** Linux host run loop interface
- \ingroup pluginGUI vst368
- - [host imp]
- - [extends IPlugFrame]
- - [released: 3.6.8]
-
- On Linux the host has to provide this interface to the plug-in as there's no global event run loop
- defined as on other platforms.
-
- A plug-in can register an event handler for a file descriptor. The host has to call the event
- handler when the file descriptor is marked readable.
-
- A plug-in also can register a timer which will be called repeatedly until it is unregistered.
- */
- class IRunLoop : public FUnknown
- {
- public:
- virtual tresult PLUGIN_API registerEventHandler (IEventHandler* handler, FileDescriptor fd) = 0;
- virtual tresult PLUGIN_API unregisterEventHandler (IEventHandler* handler) = 0;
-
- virtual tresult PLUGIN_API registerTimer (ITimerHandler* handler,
- TimerInterval milliseconds) = 0;
- virtual tresult PLUGIN_API unregisterTimer (ITimerHandler* handler) = 0;
- //------------------------------------------------------------------------
- static const FUID iid;
- };
- DECLARE_CLASS_IID (IRunLoop, 0x18C35366, 0x97764F1A, 0x9C5B8385, 0x7A871389)
-
- //------------------------------------------------------------------------
- } // namespace Linux
-
- #endif
-
- //------------------------------------------------------------------------
- } // namespace Steinberg
|