1 #ifndef DALI_GL_WINDOW_H
2 #define DALI_GL_WINDOW_H
5 * Copyright (c) 2020 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
23 #include <dali/public-api/math/rect.h>
24 #include <dali/public-api/math/uint-16-pair.h>
25 #include <dali/public-api/math/vector2.h>
26 #include <dali/public-api/math/vector4.h>
27 #include <dali/public-api/object/base-handle.h>
28 #include <dali/public-api/object/any.h>
29 #include <dali/public-api/signals/dali-signal.h>
32 #include <dali/public-api/dali-adaptor-common.h>
37 * @addtogroup dali_adaptor_framework
41 typedef Dali::Rect<int> PositionSize;
43 namespace Internal DALI_INTERNAL
53 typedef void (*GlInitialize)();
54 typedef void (*GlRenderFrame)();
55 typedef void (*GlTerminate)();
62 * @brief The GlWindow class is to draw with native GLES.
64 * This class is the special window. It is for native GLES application.
65 * So, some special funtions and type are supported.
66 * In addition, basic window's functions are supported, too.
69 class DALI_ADAPTOR_API GlWindow : public BaseHandle
73 using WindowSize = Uint16Pair ;
75 typedef Signal< void ( const KeyEvent& ) > KeyEventSignalType; ///< GlWindow Key Event signal type
76 typedef Signal< void ( const TouchEvent& ) > TouchSignalType; ///< GlWindow Touch Event signal type
77 typedef Signal< void ( GlWindow, bool ) > FocusChangeSignalType; ///< GlWindow Focus signal type
78 typedef Signal< void ( WindowSize ) > ResizedSignalType; ///< GlWindow resized signal type
79 typedef Signal< void ( GlWindow, bool ) > VisibilityChangedSignalType; ///< GlWindow visibility change signal type
86 * @brief Enumeration for orientation of the window is the way in which a rectangular page is oriented for normal viewing.
88 * This Enumeration is used the available orientation APIs and the preferred orientation.
91 enum class GlWindowOrientation
93 PORTRAIT = 0, ///< Portrait orientation. The height of the display area is greater than the width.
94 LANDSCAPE = 1, ///< Landscape orientation. A wide view area is needed.
95 PORTRAIT_INVERSE = 2, ///< Portrait inverse orientation
96 LANDSCAPE_INVERSE = 3, ///< Landscape inverse orientation
97 NO_ORIENTATION_PREFERENCE = -1 ///< Invalid angle value. It is used to initialize or unset the preferred orientation.
101 * @brief Enumeration for GLES verion
103 * This Enumeration is used the GLES version for EGL configuration.
104 * If the device can not support GLES version 3.0 over, the version will be chosen with GLES version 2.0
107 enum class GlesVersion
109 VERSION_2_0 = 0, ///< GLES version 2.0
110 VERSION_3_0, ///< GLES version 3.0
114 * @brief Creates an initialized handle to a new GlWindow.
116 * @return A new GlWindow
117 * @note This creates an extra GlWindow in addition to the default main GlWindow
119 static GlWindow New();
122 * @brief Creates an initialized handle to a new GlWindow.
124 * @param[in] positionSize The position and size of the GlWindow
125 * @param[in] name The GlWindow title
126 * @param[in] className The GlWindow class name
127 * @param[in] isTransparent Whether GlWindow is transparent
128 * @note This creates an extra GlWindow in addition to the default main GlWindow
129 * @return A new GlWindow
131 static GlWindow New( PositionSize positionSize, const std::string& name, const std::string& className, bool isTransparent = false );
134 * @brief Creates an uninitialized handle.
136 * This can be initialized using Dali::Application::GetGlWindow() or
137 * Dali::GlWindow::New().
145 * This is non-virtual since derived Handle types must not contain data or virtual methods.
151 * @brief This copy constructor is required for (smart) pointer semantics.
153 * @param[in] handle A reference to the copied handle
155 GlWindow(const GlWindow& handle);
158 * @brief This assignment operator is required for (smart) pointer semantics.
160 * @param[in] rhs A reference to the copied handle
161 * @return A reference to this
163 GlWindow& operator=(const GlWindow& rhs);
166 * @brief Sets egl configuration for GlWindow
168 * @param[in] depth the flag of depth buffer. If true is set, 24bit depth buffer is enabled.
169 * @param[in] stencil the flag of stencil. it true is set, 8bit stencil buffer is enabled.
170 * @param[in] msaa the bit of msaa.
171 * @param[in] version the GLES version
174 void SetEglConfig( bool depth, bool stencil, int msaa, GlesVersion version );
177 * @brief Raises GlWindow to the top of GlWindow stack.
183 * @brief Lowers GlWindow to the bottom of GlWindow stack.
189 * @brief Activates GlWindow to the top of GlWindow stack even it is iconified.
195 * @brief Shows the GlWindow if it is hidden.
201 * @brief Hides the GlWindow if it is showing.
207 * @brief Sets a position of the GlWindow.
209 * @param[in] positionSize The new GlWindow position
211 void SetPositionSize( PositionSize positionSize );
214 * @brief Gets a position of the GlWindow.
216 * @return The position of the GlWindow
218 PositionSize GetPositionSize() const;
221 * @brief Gets the count of supported auxiliary hints of the window.
223 * @return The number of supported auxiliary hints.
225 * @note The window auxiliary hint is the value which is used to decide which actions should be made available to the user by the window manager.
226 * If you want to set specific hint to your window, then you should check whether it exists in the supported auxiliary hints.
228 unsigned int GetSupportedAuxiliaryHintCount() const;
231 * @brief Gets the supported auxiliary hint string of the window.
233 * @param[in] index The index of the supported auxiliary hint lists
234 * @return The auxiliary hint string of the index.
236 * @note The window auxiliary hint is the value which is used to decide which actions should be made available to the user by the window manager.
237 * If you want to set specific hint to your window, then you should check whether it exists in the supported auxiliary hints.
239 std::string GetSupportedAuxiliaryHint( unsigned int index ) const;
242 * @brief Creates an auxiliary hint of the window.
244 * @param[in] hint The auxiliary hint string.
245 * @param[in] value The value string.
246 * @return The ID of created auxiliary hint, or @c 0 on failure.
248 unsigned int AddAuxiliaryHint( const std::string& hint, const std::string& value );
251 * @brief Removes an auxiliary hint of the window.
253 * @param[in] id The ID of the auxiliary hint.
254 * @return True if no error occurred, false otherwise.
256 bool RemoveAuxiliaryHint( unsigned int id );
259 * @brief Changes a value of the auxiliary hint.
261 * @param[in] id The auxiliary hint ID.
262 * @param[in] value The value string to be set.
263 * @return True if no error occurred, false otherwise.
265 bool SetAuxiliaryHintValue( unsigned int id, const std::string& value );
268 * @brief Gets a value of the auxiliary hint.
270 * @param[in] id The auxiliary hint ID.
271 * @return The string value of the auxiliary hint ID, or an empty string if none exists.
273 std::string GetAuxiliaryHintValue( unsigned int id ) const;
276 * @brief Gets a ID of the auxiliary hint string.
278 * @param[in] hint The auxiliary hint string.
279 * @return The ID of the auxiliary hint string, or @c 0 if none exists.
281 unsigned int GetAuxiliaryHintId( const std::string& hint ) const;
284 * @brief Sets a region to accept input events.
286 * @param[in] inputRegion The region to accept input events.
288 void SetInputRegion( const Rect< int >& inputRegion );
291 * @brief Sets a transparent window's visual state to opaque.
292 * @details If a visual state of a transparent window is opaque,
293 * then the window manager could handle it as an opaque window when calculating visibility.
295 * @param[in] opaque Whether the window's visual state is opaque.
296 * @remarks This will have no effect on an opaque window.
297 * It doesn't change transparent window to opaque window but lets the window manager know the visual state of the window.
299 void SetOpaqueState( bool opaque );
302 * @brief Returns whether a transparent window's visual state is opaque or not.
304 * @return True if the window's visual state is opaque, false otherwise.
305 * @remarks The return value has no meaning on an opaque window.
307 bool IsOpaqueState() const;
310 * @brief Gets current rotation angle of the window.
312 * @return The current GlWindow rotation angle if previously set, or none
314 Dali::GlWindow::GlWindowOrientation GetCurrentOrientation() const;
317 * @brief Sets available orientations of the window.
319 * This API is for setting several orientations one time.
321 * @param[in] orientations The available orientations list to add
323 void SetAvailableOrientations( const Dali::Vector<Dali::GlWindow::GlWindowOrientation>& orientations );
326 * @brief Sets a preferred orientation.
328 * @param[in] orientation The preferred orientation
329 * @pre angle is in the list of available orientation.
331 * @note To unset the preferred orientation, angle should be set NO_ORIENTATION_PREFERENCE.
333 void SetPreferredOrientation( Dali::GlWindow::GlWindowOrientation orientation );
336 * @brief Registers a GL callback function for application.
338 * @param[in] glInit the callback function for application initialize
339 * @param[in] glRenderFrame the callback function to render to the frame.
340 * @param[in] glTerminate the callback function to clean-up application GL resource.
343 void RegisterGlCallback( GlInitialize glInit, GlRenderFrame glRenderFrame, GlTerminate glTerminate );
346 * @brief Renders once more even if GL render functions are not added to idler.
347 * @note Will not work if the window is hidden or GL render functions are added to idler
355 * @brief The user should connect to this signal to get a timing when GlWindow gains focus or loses focus.
357 * A callback of the following type may be connected:
359 * void YourCallbackName( GlWindow GlWindow, bool focusIn );
361 * The parameter is true if GlWindow gains focus, otherwise false.
362 * and GlWindow means this signal was called from what GlWindow
364 * @return The signal to connect to
366 FocusChangeSignalType& FocusChangeSignal();
369 * @brief This signal is emitted when the GlWindow is resized.
371 * A callback of the following type may be connected:
373 * void YourCallbackName( GlWindow GlWindow, int width, int height );
375 * The parameters are the resized width and height.
376 * and GlWindow means this signal was called from what GlWindow
378 * @return The signal to connect to
380 ResizedSignalType& ResizedSignal();
383 * @brief This signal is emitted when key event is received.
385 * A callback of the following type may be connected:
387 * void YourCallbackName(const KeyEvent& event);
390 * @return The signal to connect to
392 KeyEventSignalType& KeyEventSignal();
395 * @brief This signal is emitted when the screen is touched and when the touch ends
396 * (i.e. the down & up touch events only).
398 * If there are multiple touch points, then this will be emitted when the first touch occurs and
399 * then when the last finger is lifted.
400 * An interrupted event will also be emitted (if it occurs).
401 * A callback of the following type may be connected:
403 * void YourCallbackName(const TouchEvent& event);
406 * @return The touch signal to connect to
408 * @note Motion events are not emitted.
410 TouchSignalType& TouchSignal();
413 * @brief This signal is emitted when the window is shown or hidden.
415 * A callback of the following type may be connected:
417 * void YourCallbackName( Window window, bool visible );
420 * @return The signal to connect to
422 VisibilityChangedSignalType& VisibilityChangedSignal();
424 public: // Not intended for application developers
427 * @brief This constructor is used by Dali::Application::GetGlWindow().
428 * @param[in] GlWindow A pointer to the GlWindow
430 explicit DALI_INTERNAL GlWindow( Internal::Adaptor::GlWindow* GlWindow );
439 #endif // DALI_GL_WINDOW_H