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& ) > TouchEventSignalType; ///< GlWindow Touch Event signal type
77 typedef Signal< void ( GlWindow, bool ) > FocusChangeSignalType; ///< GlWindow Focus signal type
78 typedef Signal< void ( WindowSize ) > ResizeSignalType; ///< GlWindow resize 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 Move constructor.
168 * @param[in] rhs A reference to the moved handle
170 GlWindow(GlWindow&& rhs);
173 * @brief Move assignment operator.
175 * @param[in] rhs A reference to the moved handle
176 * @return A reference to this handle
178 GlWindow& operator=(GlWindow&& rhs);
181 * @brief Sets egl configuration for GlWindow
183 * @param[in] depth the flag of depth buffer. If true is set, 24bit depth buffer is enabled.
184 * @param[in] stencil the flag of stencil. it true is set, 8bit stencil buffer is enabled.
185 * @param[in] msaa the bit of msaa.
186 * @param[in] version the GLES version
189 void SetEglConfig( bool depth, bool stencil, int msaa, GlesVersion version );
192 * @brief Raises GlWindow to the top of GlWindow stack.
198 * @brief Lowers GlWindow to the bottom of GlWindow stack.
204 * @brief Activates GlWindow to the top of GlWindow stack even it is iconified.
210 * @brief Shows the GlWindow if it is hidden.
216 * @brief Hides the GlWindow if it is showing.
222 * @brief Sets a position of the GlWindow.
224 * @param[in] positionSize The new GlWindow position
226 void SetPositionSize( PositionSize positionSize );
229 * @brief Gets a position of the GlWindow.
231 * @return The position of the GlWindow
233 PositionSize GetPositionSize() const;
236 * @brief Gets the count of supported auxiliary hints of the window.
238 * @return The number of supported auxiliary hints.
240 * @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.
241 * If you want to set specific hint to your window, then you should check whether it exists in the supported auxiliary hints.
243 unsigned int GetSupportedAuxiliaryHintCount() const;
246 * @brief Gets the supported auxiliary hint string of the window.
248 * @param[in] index The index of the supported auxiliary hint lists
249 * @return The auxiliary hint string of the index.
251 * @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.
252 * If you want to set specific hint to your window, then you should check whether it exists in the supported auxiliary hints.
254 std::string GetSupportedAuxiliaryHint( unsigned int index ) const;
257 * @brief Creates an auxiliary hint of the window.
259 * @param[in] hint The auxiliary hint string.
260 * @param[in] value The value string.
261 * @return The ID of created auxiliary hint, or @c 0 on failure.
263 unsigned int AddAuxiliaryHint( const std::string& hint, const std::string& value );
266 * @brief Removes an auxiliary hint of the window.
268 * @param[in] id The ID of the auxiliary hint.
269 * @return True if no error occurred, false otherwise.
271 bool RemoveAuxiliaryHint( unsigned int id );
274 * @brief Changes a value of the auxiliary hint.
276 * @param[in] id The auxiliary hint ID.
277 * @param[in] value The value string to be set.
278 * @return True if no error occurred, false otherwise.
280 bool SetAuxiliaryHintValue( unsigned int id, const std::string& value );
283 * @brief Gets a value of the auxiliary hint.
285 * @param[in] id The auxiliary hint ID.
286 * @return The string value of the auxiliary hint ID, or an empty string if none exists.
288 std::string GetAuxiliaryHintValue( unsigned int id ) const;
291 * @brief Gets a ID of the auxiliary hint string.
293 * @param[in] hint The auxiliary hint string.
294 * @return The ID of the auxiliary hint string, or @c 0 if none exists.
296 unsigned int GetAuxiliaryHintId( const std::string& hint ) const;
299 * @brief Sets a region to accept input events.
301 * @param[in] inputRegion The region to accept input events.
303 void SetInputRegion( const Rect< int >& inputRegion );
306 * @brief Sets a transparent window's visual state to opaque.
307 * @details If a visual state of a transparent window is opaque,
308 * then the window manager could handle it as an opaque window when calculating visibility.
310 * @param[in] opaque Whether the window's visual state is opaque.
311 * @remarks This will have no effect on an opaque window.
312 * It doesn't change transparent window to opaque window but lets the window manager know the visual state of the window.
314 void SetOpaqueState( bool opaque );
317 * @brief Returns whether a transparent window's visual state is opaque or not.
319 * @return True if the window's visual state is opaque, false otherwise.
320 * @remarks The return value has no meaning on an opaque window.
322 bool IsOpaqueState() const;
325 * @brief Gets current rotation angle of the window.
327 * @return The current GlWindow rotation angle if previously set, or none
329 Dali::GlWindow::GlWindowOrientation GetCurrentOrientation() const;
332 * @brief Sets available orientations of the window.
334 * This API is for setting several orientations one time.
336 * @param[in] orientations The available orientations list to add
338 void SetAvailableOrientations( const Dali::Vector<Dali::GlWindow::GlWindowOrientation>& orientations );
341 * @brief Sets a preferred orientation.
343 * @param[in] orientation The preferred orientation
344 * @pre angle is in the list of available orientation.
346 * @note To unset the preferred orientation, angle should be set NO_ORIENTATION_PREFERENCE.
348 void SetPreferredOrientation( Dali::GlWindow::GlWindowOrientation orientation );
351 * @brief Registers a GL callback function for application.
353 * @param[in] glInit the callback function for application initialize
354 * @param[in] glRenderFrame the callback function to render to the frame.
355 * @param[in] glTerminate the callback function to clean-up application GL resource.
358 void RegisterGlCallback( GlInitialize glInit, GlRenderFrame glRenderFrame, GlTerminate glTerminate );
361 * @brief Renders once more even if GL render functions are not added to idler.
362 * @note Will not work if the window is hidden or GL render functions are added to idler
370 * @brief The user should connect to this signal to get a timing when GlWindow gains focus or loses focus.
372 * A callback of the following type may be connected:
374 * void YourCallbackName( GlWindow GlWindow, bool focusIn );
376 * The parameter is true if GlWindow gains focus, otherwise false.
377 * and GlWindow means this signal was called from what GlWindow
379 * @return The signal to connect to
381 FocusChangeSignalType& FocusChangeSignal();
384 * @brief This signal is emitted when the GlWindow is resized.
386 * A callback of the following type may be connected:
388 * void YourCallbackName( GlWindow GlWindow, int width, int height );
390 * The parameters are the resized width and height.
391 * and GlWindow means this signal was called from what GlWindow
393 * @return The signal to connect to
395 ResizeSignalType& ResizeSignal();
398 * @brief This signal is emitted when key event is received.
400 * A callback of the following type may be connected:
402 * void YourCallbackName(const KeyEvent& event);
405 * @return The signal to connect to
407 KeyEventSignalType& KeyEventSignal();
410 * @brief This signal is emitted when the screen is touched and when the touch ends
411 * (i.e. the down & up touch events only).
413 * If there are multiple touch points, then this will be emitted when the first touch occurs and
414 * then when the last finger is lifted.
415 * An interrupted event will also be emitted (if it occurs).
416 * A callback of the following type may be connected:
418 * void YourCallbackName(const TouchEvent& event);
421 * @return The touch signal to connect to
423 * @note Motion events are not emitted.
425 TouchEventSignalType& TouchedSignal();
428 * @brief This signal is emitted when the window is shown or hidden.
430 * A callback of the following type may be connected:
432 * void YourCallbackName( Window window, bool visible );
435 * @return The signal to connect to
437 VisibilityChangedSignalType& VisibilityChangedSignal();
439 public: // Not intended for application developers
442 * @brief This constructor is used by Dali::Application::GetGlWindow().
443 * @param[in] GlWindow A pointer to the GlWindow
445 explicit DALI_INTERNAL GlWindow( Internal::Adaptor::GlWindow* GlWindow );
454 #endif // DALI_GL_WINDOW_H