Bläddra i källkod

Refactored RenderTarget a bit to make is prettier (no real funcionality added)

Marko Pintera 12 år sedan
förälder
incheckning
6b1dfdc6be

+ 2 - 2
CamelotClient/CamelotClient.cpp

@@ -37,9 +37,9 @@
 #include "CmRTTIType.h"
 #include "CmCursor.h"
 
-#define DX11
+//#define DX11
 //#define DX9
-//#define GL
+#define GL
 
 using namespace CamelotFramework;
 using namespace BansheeEditor;

+ 4 - 1
CamelotCore/Include/CmMultiRenderTexture.h

@@ -23,6 +23,9 @@ namespace CamelotFramework
 		 */
 		bool isWindow() const { return true; }
 
+		/**
+		 * @copydoc RenderTarget::requiresTextureFlipping.
+		 */
 		bool requiresTextureFlipping() const { return false; }
 
 	protected:
@@ -39,6 +42,6 @@ namespace CamelotFramework
 	private:
 		void throwIfBuffersDontMatch() const;
 
-		virtual void copyContentsToMemory(const PixelData &dst, FrameBuffer buffer = FB_AUTO);
+		virtual void copyToMemory(const PixelData &dst, FrameBuffer buffer = FB_AUTO);
 	};
 }

+ 26 - 123
CamelotCore/Include/CmRenderTarget.h

@@ -25,8 +25,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 -----------------------------------------------------------------------------
 */
-#ifndef __RenderTarget_H__
-#define __RenderTarget_H__
+#pragma once
 
 #include "CmPrerequisites.h"
 
@@ -36,13 +35,6 @@ THE SOFTWARE.
 #include "CmCoreObject.h"
 #include "boost/signal.hpp"
 
-/* Define the number of priority groups for the render system's render targets. */
-#ifndef CM_NUM_RENDERTARGET_GROUPS
-	#define CM_NUM_RENDERTARGET_GROUPS 10
-	#define CM_DEFAULT_RT_GROUP 4
-	#define CM_REND_TO_TEX_RT_GROUP 2
-#endif
-
 namespace CamelotFramework 
 {
 	struct CM_EXPORT RENDER_SURFACE_DESC
@@ -53,23 +45,6 @@ namespace CamelotFramework
 		UINT32 mipLevel;
 	};
 
-	/** \addtogroup Core
-	*  @{
-	*/
-	/** \addtogroup RenderSystem
-	*  @{
-	*/
-	/** A 'canvas' which can receive the results of a rendering
-        operation.
-        @remarks
-            This abstract class defines a common root to all targets of rendering operations. A
-            render target could be a window on a screen, or another
-            offscreen surface like a texture or bump map etc.
-        @author
-            Steven Streeting
-        @version
-            1.0
-     */
     class CM_EXPORT RenderTarget : public CoreObject
     {
     public:
@@ -82,124 +57,52 @@ namespace CamelotFramework
 
         virtual ~RenderTarget();
 
-        /// Retrieve target's name.
-        virtual const String& getName(void) const;
-
-        /// Retrieve information about the render target.
-        virtual void getMetrics(unsigned int& width, unsigned int& height, unsigned int& colourDepth);
+        const String& getName() const { return mName; }
+        UINT32 getWidth() const { return mWidth; }
+        UINT32 getHeight() const { return mHeight; }
+		UINT32 getColorDepth() const { return mColorDepth; }
+		UINT32 getFSAA() const { return mFSAA; }
+		const String& getFSAAHint() const { return mFSAAHint; }
 
-        virtual unsigned int getWidth(void) const;
-        virtual unsigned int getHeight(void) const;
-        virtual unsigned int getColourDepth(void) const;
+		/**
+		 * @brief	Returns true if the render target will wait for vertical sync before swapping buffers.
+		 */
+		bool getVSync() const { return mVSync; }
 
-        /**
-         * @brief	Swaps the frame buffers to display the next frame.
-         * 			
-		 * @note	Core thread only.
-         */
-		virtual void swapBuffers() {};
+		virtual void getCustomAttribute(const String& name, void* pData) const;
 
 		/**
 		 * @brief	Returns true if the render target is a render window.
 		 */
 		virtual bool isWindow() const = 0;
+		bool isActive() const { return mActive; }
+		bool isHwGammaEnabled() const { return mHwGamma; }
 
-        /** Gets a custom (maybe platform-specific) attribute.
-            @remarks
-                This is a nasty way of satisfying any API's need to see platform-specific details.
-                It horrid, but D3D needs this kind of info. At least it's abstracted.
-            @param
-                name The name of the attribute.
-            @param
-                pData Pointer to memory of the right kind of structure to receive the info.
-        */
-        virtual void getCustomAttribute(const String& name, void* pData) const;
-
-		/** Sets the priority of this render target in relation to the others. 
-        @remarks
-            This can be used in order to schedule render target updates. Lower
-            priorities will be rendered first. Note that the priority must be set
-            at the time the render target is attached to the render system, changes
-            afterwards will not affect the ordering.
-        */
-        virtual void setPriority( UINT8 priority ) { mPriority = priority; }
-        /** Gets the priority of a render target. */
-		virtual UINT8 getPriority() const { return mPriority; }
-
-        /** Used to retrieve or set the active state of the render target.
-        */
-        virtual bool isActive() const;
-
-        /** Used to set the active state of the render target.
-        */
-        virtual void setActive( bool state );
-
-		/** Copies the current contents of the render target to a pixelbox. 
-		@remarks See suggestPixelFormat for a tip as to the best pixel format to
-			extract into, although you can use whatever format you like and the 
-			results will be converted.
-		*/
-		virtual void copyContentsToMemory(const PixelData &dst, FrameBuffer buffer = FB_AUTO) = 0;
-
-		/** Suggests a pixel format to use for extracting the data in this target, 
-			when calling copyContentsToMemory.
-		*/
-		virtual PixelFormat suggestPixelFormat() const { return PF_BYTE_RGBA; }
+		virtual void setActive(bool state) { mActive = state; }
 
+        /**
+         * @brief	Swaps the frame buffers to display the next frame.
+         * 			
+		 * @note	Core thread only.
+         */
+		virtual void swapBuffers() {};
+		virtual void copyToMemory(const PixelData &dst, FrameBuffer buffer = FB_AUTO) = 0;
 		virtual bool requiresTextureFlipping() const = 0;
 
-		/** Indicates whether on rendering, linear colour space is converted to 
-			sRGB gamma colour space. This is the exact opposite conversion of
-			what is indicated by Texture::isHardwareGammaEnabled, and can only
-			be enabled on creation of the render target. For render windows, it's
-			enabled through the 'gamma' creation misc parameter. For textures, 
-			it is enabled through the hwGamma parameter to the create call.
-		*/
-		virtual bool isHardwareGammaEnabled() const { return mHwGamma; }
-
-		/** Indicates whether multisampling is performed on rendering and at what level.
-		*/
-		virtual UINT32 getFSAA() const { return mFSAA; }
-
-		/** Gets the FSAA hint (@see Root::createRenderWindow)
-		*/
-		virtual const String& getFSAAHint() const { return mFSAAHint; }
-
-		/**
-		 * @brief	Returns true if the render target will wait for vertical sync before swapping buffers.
-		 */
-		bool getVSync() const { return mVSync; }
-
-		/**
-		 * @brief	Set whether the render target will wait for vertical sync before swapping buffers.
-		 */
-		void setVSync(bool vsync)  { mVSync = vsync; }
-
 		mutable boost::signal<void(RenderTarget*)> onMovedOrResized;
     protected:
 		RenderTarget();
 
-        /// The name of this target.
         String mName;
-		/// The priority of the render target.
-		UINT8 mPriority;
 
-        unsigned int mWidth;
-        unsigned int mHeight;
-        unsigned int mColorDepth;
+        UINT32 mWidth;
+        UINT32 mHeight;
+        UINT32 mColorDepth;
 
         bool mActive;
-		// Hardware sRGB gamma conversion done on write?
 		bool mHwGamma;
-		// Wait for vsync?
 		bool mVSync;
-		// FSAA performed?
 		UINT32 mFSAA;
 		String mFSAAHint;
     };
-	/** @} */
-	/** @} */
-
-} // Namespace
-
-#endif
+}

+ 15 - 26
CamelotCore/Include/CmRenderTexture.h

@@ -25,8 +25,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 -----------------------------------------------------------------------------
 */
-#ifndef __RenderTexture_H__
-#define __RenderTexture_H__
+#pragma once
 
 #include "CmPrerequisites.h"
 #include "CmTexture.h"
@@ -40,50 +39,40 @@ namespace CamelotFramework
 		RENDER_SURFACE_DESC depthStencilSurface;
 	};
 
-	/** \addtogroup Core
-	*  @{
-	*/
-	/** \addtogroup RenderSystem
-	*  @{
-	*/
-	/** This class represents a RenderTarget that renders to a Texture. There is no 1 on 1
-        relation between Textures and RenderTextures, as there can be multiple 
-        RenderTargets rendering to different mipmaps, faces (for cubemaps) or slices (for 3D textures)
-        of the same Texture.
-    */
     class CM_EXPORT RenderTexture : public RenderTarget
     {
 	public:
 		virtual ~RenderTexture();
 
-		bool requiresTextureFlipping() const { return false; }
+		static RenderTexturePtr create(TextureType textureType, UINT32 width, UINT32 height, 
+			PixelFormat format, bool hwGamma, UINT32 fsaa, const String& fsaaHint, 
+			bool createDepth = true, PixelFormat depthStencilFormat = PF_D24S8);
+
+		void initialize(const RENDER_TEXTURE_DESC& desc);
 
 		/**
 		 * @copydoc RenderTarget::isWindow.
 		 */
 		bool isWindow() const { return false; }
 
-		void initialize(const RENDER_TEXTURE_DESC& desc);
+		/**
+		 * @copydoc RenderTarget::requiresTextureFlipping.
+		 */
+		bool requiresTextureFlipping() const { return false; }
 
 	protected:
+		TextureViewPtr mColorSurface;
+		TextureViewPtr mDepthStencilSurface;
+
 		RenderTexture();
 
 		/**
 		 * @copydoc RenderTarget::destroy_internal()
 		 */
 		virtual void destroy_internal();
-
-	protected:
-		TextureViewPtr mColorSurface;
-		TextureViewPtr mDepthStencilSurface;
-
 	private:
 		void throwIfBuffersDontMatch() const;
 
-		virtual void copyContentsToMemory( const PixelData &dst, FrameBuffer buffer = FB_AUTO );
+		virtual void copyToMemory(const PixelData &dst, FrameBuffer buffer = FB_AUTO);
 	};
-	/** @} */
-	/** @} */
-}
-
-#endif
+}

+ 4 - 45
CamelotCore/Include/CmRenderWindow.h

@@ -23,8 +23,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE
 -------------------------------------------------------------------------*/
-#ifndef __RenderWindow_H__
-#define __RenderWindow_H__
+#pragma once
 
 #include "CmPrerequisites.h"
 
@@ -81,41 +80,14 @@ namespace CamelotFramework
 		NameValuePairList platformSpecific;
 	};
 
-	/** \addtogroup Core
-	*  @{
-	*/
-	/** \addtogroup RenderSystem
-	*  @{
-	*/
-	/** Manages the target rendering window.
-        @remarks
-            This class handles a window into which the contents
-            of a scene are rendered. There is a many-to-1 relationship
-            between instances of this class an instance of RenderSystem
-            which controls the rendering of the scene. There may be
-            more than one window in the case of level editor tools etc.
-            This class is abstract since there may be
-            different implementations for different windowing systems.
-        @remarks
-            Instances are created and communicated with by the render system
-            although client programs can get a reference to it from
-            the render system if required for resizing or moving.
-            Note that you can have multiple viewpoints
-            in the window for effects like rear-view mirrors and
-            picture-in-picture views (see Viewport and Camera).
-        @author
-            Steven Streeting
-        @version
-            1.0
-    */
     class CM_EXPORT RenderWindow : public RenderTarget
     {
     public:
 		virtual ~RenderWindow();
 
 		/** 
-			@brief Core method. Alter fullscreen mode options.
-		*/
+		 *	@brief Core method. Alter fullscreen mode options.
+		 */
 		virtual void setFullscreen(bool fullScreen, UINT32 width, UINT32 height)
                 { (void)fullScreen; (void)width; (void)height; }
 
@@ -167,13 +139,6 @@ namespace CamelotFramework
 		 */
 		bool hasFocus() const { return mHasFocus; }
 
-        /**   
-        * @brief	Overloaded version of getMetrics from RenderTarget, including extra details
-		*			specific to windowing systems.
-        */
-        virtual void getMetrics(UINT32& width, UINT32& height, UINT32& colourDepth, 
-			INT32& left, INT32& top);
-
 		/**
          * @brief	Internal method. Core method. Called when window is moved or resized.
          */
@@ -205,8 +170,6 @@ namespace CamelotFramework
     protected:
 		friend class RenderWindowManager;
 
-        /** Default constructor.
-        */
         RenderWindow(const RENDER_WINDOW_DESC& desc);
         
 	protected:
@@ -217,8 +180,4 @@ namespace CamelotFramework
 
 		RENDER_WINDOW_DESC mDesc;
     };
-	/** @} */
-	/** @} */
-
-} // Namespace
-#endif
+}

+ 1 - 2
CamelotCore/Source/CmMultiRenderTexture.cpp

@@ -40,7 +40,6 @@ namespace CamelotFramework
 
 				if(!colorSurfacePropertiesSet)
 				{
-					mPriority = CM_REND_TO_TEX_RT_GROUP;
 					mWidth = texture->getWidth();
 					mHeight = texture->getWidth();
 					mColorDepth = CamelotFramework::PixelUtil::getNumElemBits(texture->getFormat());
@@ -147,7 +146,7 @@ namespace CamelotFramework
 		}
 	}
 
-	void MultiRenderTexture::copyContentsToMemory( const PixelData &dst, FrameBuffer buffer /*= FB_AUTO */ )
+	void MultiRenderTexture::copyToMemory(const PixelData &dst, FrameBuffer buffer)
 	{
 		throw std::exception("The method or operation is not implemented.");
 	}

+ 2 - 40
CamelotCore/Source/CmRenderTarget.cpp

@@ -34,11 +34,8 @@ THE SOFTWARE.
 namespace CamelotFramework {
 
     RenderTarget::RenderTarget()
-		:mPriority(CM_DEFAULT_RT_GROUP),
-		mActive(true),
-		mHwGamma(false), 
-		mVSync(false),
-		mFSAA(0)
+		:mActive(true), mHwGamma(false), mVSync(false), mFSAA(0),
+		mWidth(0), mHeight(0), mColorDepth(0)
     {
     }
 
@@ -46,43 +43,8 @@ namespace CamelotFramework {
     {
     }
 
-    const String& RenderTarget::getName(void) const
-    {
-        return mName;
-    }
-
-    void RenderTarget::getMetrics(unsigned int& width, unsigned int& height, unsigned int& colourDepth)
-    {
-        width = mWidth;
-        height = mHeight;
-        colourDepth = mColorDepth;
-    }
-
-    unsigned int RenderTarget::getWidth(void) const
-    {
-        return mWidth;
-    }
-    unsigned int RenderTarget::getHeight(void) const
-    {
-        return mHeight;
-    }
-    unsigned int RenderTarget::getColourDepth(void) const
-    {
-        return mColorDepth;
-    }
-
 	void RenderTarget::getCustomAttribute(const String& name, void* pData) const
     {
         CM_EXCEPT(InvalidParametersException, "Attribute not found.");
     }
-
-    bool RenderTarget::isActive() const
-    {
-        return mActive;
-    }
-
-    void RenderTarget::setActive( bool state )
-    {
-        mActive = state;
-    }
 }        

+ 8 - 2
CamelotCore/Source/CmRenderTexture.cpp

@@ -45,6 +45,13 @@ namespace CamelotFramework
 
 	}
 
+	RenderTexturePtr RenderTexture::create(TextureType textureType, UINT32 width, UINT32 height, 
+		PixelFormat format, bool hwGamma, UINT32 fsaa, const String& fsaaHint, 
+		bool createDepth, PixelFormat depthStencilFormat)
+	{
+		return TextureManager::instance().createRenderTexture(textureType, width, height, format, hwGamma, fsaa, fsaaHint, createDepth, depthStencilFormat);
+	}
+
 	void RenderTexture::destroy_internal()
 	{
 		if(mColorSurface != nullptr)
@@ -68,7 +75,6 @@ namespace CamelotFramework
 			mColorSurface = Texture::requestView(texture, desc.colorSurface.mipLevel, 1, 
 				desc.colorSurface.face, desc.colorSurface.numFaces, GVU_RENDERTARGET);
 
-			mPriority = CM_REND_TO_TEX_RT_GROUP;
 			mWidth = texture->getWidth();
 			mHeight = texture->getWidth();
 			mColorDepth = CamelotFramework::PixelUtil::getNumElemBits(texture->getFormat());
@@ -132,7 +138,7 @@ namespace CamelotFramework
 		}
 	}
 
-	void RenderTexture::copyContentsToMemory( const PixelData &dst, FrameBuffer buffer /*= FB_AUTO */ )
+	void RenderTexture::copyToMemory( const PixelData &dst, FrameBuffer buffer /*= FB_AUTO */ )
 	{
 		throw std::exception("The method or operation is not implemented.");
 	}

+ 1 - 14
CamelotCore/Source/CmRenderWindow.cpp

@@ -33,10 +33,7 @@ THE SOFTWARE.
 namespace CamelotFramework 
 {
     RenderWindow::RenderWindow(const RENDER_WINDOW_DESC& desc)
-        : RenderTarget()
-		, mIsFullScreen(false)
-		, mDesc(desc)
-		, mHasFocus(false)
+        : RenderTarget(), mIsFullScreen(false), mDesc(desc), mHasFocus(false), mLeft(0), mTop(0)
     {
 
     }
@@ -46,16 +43,6 @@ namespace CamelotFramework
 		
 	}
 
-    void RenderWindow::getMetrics(UINT32& width, UINT32& height, UINT32& colourDepth,
-		INT32& left, INT32& top)
-    {
-        width = mWidth;
-        height = mHeight;
-        colourDepth = mColorDepth;
-        left = mLeft;
-        top = mTop;
-    }
-
 	void RenderWindow::setVisible(bool visible)
 	{
 		THROW_IF_NOT_CORE_THREAD;

+ 0 - 7
CamelotCore/Source/CmWindowEventUtilities.cpp

@@ -324,15 +324,8 @@ void GLXProc( RenderWindow *win, const XEvent &event )
 	case ConfigureNotify:
 	{    
         // This could be slightly more efficient if windowMovedOrResized took arguments:
-		unsigned int oldWidth, oldHeight, oldDepth;
-		int oldLeft, oldTop;
-		win->getMetrics(oldWidth, oldHeight, oldDepth, oldLeft, oldTop);
 		win->_windowMovedOrResized();
 
-		unsigned int newWidth, newHeight, newDepth;
-		int newLeft, newTop;
-		win->getMetrics(newWidth, newHeight, newDepth, newLeft, newTop);
-
 		break;
 	}
 	case FocusIn:     // Gained keyboard focus

+ 1 - 4
CamelotD3D11RenderSystem/Include/CmD3D11RenderWindow.h

@@ -38,7 +38,7 @@ namespace CamelotFramework
 		/**
 		 * @copydoc RenderWindow::copyContentsToMemory
 		 */
-		void copyContentsToMemory(const PixelData &dst, FrameBuffer buffer);
+		void copyToMemory(const PixelData &dst, FrameBuffer buffer);
 
 		/**
 		 * @copydoc RenderWindow::swapBuffers
@@ -81,9 +81,6 @@ namespace CamelotFramework
 		void startMove();
 		void endMove();
 
-		/**
-		 * @copydoc RenderWindow::reposition
-		 */
 		void _windowMovedOrResized();
 
 		DXGI_SWAP_CHAIN_DESC* _getPresentationParameters(void) { return &mSwapChainDesc; }

+ 1 - 1
CamelotD3D11RenderSystem/Source/CmD3D11RenderWindow.cpp

@@ -457,7 +457,7 @@ namespace CamelotFramework
 		RenderWindow::getCustomAttribute(name, pData);
 	}
 
-	void D3D11RenderWindow::copyContentsToMemory(const PixelData &dst, FrameBuffer buffer)
+	void D3D11RenderWindow::copyToMemory(const PixelData &dst, FrameBuffer buffer)
 	{
 		THROW_IF_NOT_CORE_THREAD;
 

+ 1 - 1
CamelotD3D9Renderer/Include/CmD3D9RenderWindow.h

@@ -81,7 +81,7 @@ namespace CamelotFramework
 		/**
 		 * @copydoc RenderWindow::copyContentsToMemory
 		 */
-		void copyContentsToMemory(const PixelData &dst, FrameBuffer buffer);
+		void copyToMemory(const PixelData &dst, FrameBuffer buffer);
 
 		/**
 		 * @copydoc RenderWindow::requiresTextureFlipping

+ 1 - 1
CamelotD3D9Renderer/Source/CmD3D9RenderSystem.cpp

@@ -1164,7 +1164,7 @@ namespace CamelotFramework
 			CM_EXCEPT(RenderingAPIException, "Failed to set viewport.");
 
 		// Set sRGB write mode
-		__SetRenderState(D3DRS_SRGBWRITEENABLE, target->isHardwareGammaEnabled());
+		__SetRenderState(D3DRS_SRGBWRITEENABLE, target->isHwGammaEnabled());
 	}
 	//---------------------------------------------------------------------
 	void D3D9RenderSystem::beginFrame()

+ 1 - 1
CamelotD3D9Renderer/Source/CmD3D9RenderWindow.cpp

@@ -479,7 +479,7 @@ namespace CamelotFramework
 		return Int2(pos.x, pos.y);
 	}
 
-	void D3D9RenderWindow::copyContentsToMemory(const PixelData &dst, FrameBuffer buffer)
+	void D3D9RenderWindow::copyToMemory(const PixelData &dst, FrameBuffer buffer)
 	{
 		THROW_IF_NOT_CORE_THREAD;
 

+ 1 - 1
CamelotGLRenderer/Include/CmWin32Window.h

@@ -71,7 +71,7 @@ namespace CamelotFramework
 		/**
 		 * @copydoc RenderWindow::copyContentsToMemory
 		 */
-		void copyContentsToMemory(const PixelData &dst, FrameBuffer buffer);
+		void copyToMemory(const PixelData &dst, FrameBuffer buffer);
 
 		/**
 		 * @copydoc RenderWindow::swapBuffers

+ 1 - 1
CamelotGLRenderer/Source/CmGLRenderSystem.cpp

@@ -617,7 +617,7 @@ namespace CamelotFramework
 		if (GLEW_EXT_framebuffer_sRGB)
 		{
 			// Enable / disable sRGB states
-			if (target->isHardwareGammaEnabled())
+			if (target->isHwGammaEnabled())
 			{
 				glEnable(GL_FRAMEBUFFER_SRGB_EXT);
 

+ 1 - 1
CamelotGLRenderer/Source/CmWin32Window.cpp

@@ -598,7 +598,7 @@ namespace CamelotFramework
 		}
 	}
 
-	void Win32Window::copyContentsToMemory(const PixelData &dst, FrameBuffer buffer)
+	void Win32Window::copyToMemory(const PixelData &dst, FrameBuffer buffer)
 	{
 		THROW_IF_NOT_CORE_THREAD;
 

+ 6 - 0
EditorWindowDock.txt

@@ -39,6 +39,12 @@ DockContainer biggest issues:
 
 FIRST CREATE DOCK CONTAINER WITHOUT DRAG AND DROP SUPPORT
 
+Add RenderTexture::create
+ - Attempt creating one and attaching it to the primary camera
+ - Test DX9/DX11/OpenGL
+ - Figure out how to use it for display, and then create a GUIRenderTexture element.
+    - Rendering from it should technically just involve setting it as a sprite texture and using ImageSprite
+
 Make sure to test everything thoroughly - right now I have tested very little
 Drag and drop manager currently ignores the provided icon, but it should use it as a cursor
 

+ 1 - 0
TODO.txt

@@ -40,6 +40,7 @@ TextBox needed elements:
   - Add special text input commands, which will get repeatedly sent as long as their corresponding key is set in GUIManager
  - Get DebugCamera to ignore input if GUI has already processed it
  - Cut/Copy/Paste
+ - Clicking on the InputBox doesn't display the cursor. I need to click another time and then it shows up.
 
  - LATER
   - TAB between input elements