1 #ifndef DALI_APPLICATION_H
2 #define DALI_APPLICATION_H
5 * Copyright (c) 2018 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.
22 #include <dali/public-api/common/view-mode.h>
23 #include <dali/public-api/object/base-handle.h>
24 #include <dali/public-api/signals/callback.h>
27 #include <dali/public-api/adaptor-framework/application-configuration.h>
28 #include <dali/public-api/adaptor-framework/device-status.h>
29 #include <dali/public-api/adaptor-framework/window.h>
34 * @addtogroup dali_adaptor_framework
38 namespace Internal DALI_INTERNAL
46 * @brief An Application class object should be created by every application
47 * that wishes to use Dali.
49 * It provides a means for initializing the
50 * resources required by the Dali::Core.
52 * The Application class emits several signals which the user can
53 * connect to. The user should not create any Dali objects in the main
54 * function and instead should connect to the Init signal of the
55 * Application and create the Dali objects in the connected callback.
57 * Applications should follow the example below:
60 * class ExampleController: public ConnectionTracker
63 * ExampleController( Application& application )
64 * : mApplication( application )
66 * mApplication.InitSignal().Connect( this, &ExampleController::Create );
69 * void Create( Application& application )
71 * // Create Dali components...
75 * Application& mApplication;
78 * int main (int argc, char **argv)
80 * Application app = Application::New(&argc, &argv);
81 * ExampleController example( app );
86 * If required, you can also connect class member functions to a signal:
90 * app.ResumeSignal().Connect(&app, &MyApplication::Resume);
93 * This class accepts command line arguments as well. The following options are supported:
96 * --no-vsync Disable VSync on Render
97 * -w|--width Stage Width
98 * -h|--height Stage Height
99 * -d|--dpi Emulated DPI
103 * When the above options are found, they are stripped from argv, and argc is updated appropriately.
106 class DALI_ADAPTOR_API Application : public BaseHandle
110 typedef Signal< void (DeviceStatus::Battery::Status) > LowBatterySignalType; ///< Application device signal type @SINCE_1_2.62
111 typedef Signal< void (DeviceStatus::Memory::Status) > LowMemorySignalType; ///< Application device signal type @SINCE_1_2.62
112 typedef Signal< void (Application&) > AppSignalType; ///< Application lifecycle signal and system signal callback type @SINCE_1_0.0
113 typedef Signal< void (Application&, void *) > AppControlSignalType; ///< Application control signal callback type @SINCE_1_0.0
116 * @brief Enumeration for deciding whether a Dali application window is opaque or transparent.
121 OPAQUE = 0, ///< The window will be opaque @SINCE_1_0.0
122 TRANSPARENT = 1 ///< The window transparency will match the alpha value set in Dali::Stage::SetBackgroundcolor() @SINCE_1_0.0
128 * @brief This is the constructor for applications without an argument list.
132 * @return A handle to the Application
134 static Application New();
137 * @brief This is the constructor for applications.
142 * @param[in,out] argc A pointer to the number of arguments
143 * @param[in,out] argv A pointer to the argument list
144 * @return A handle to the Application
146 static Application New( int* argc, char **argv[] );
149 * @brief This is the constructor for applications with a name.
154 * @param[in,out] argc A pointer to the number of arguments
155 * @param[in,out] argv A pointer to the argument list
156 * @param[in] stylesheet The path to user defined theme file
157 * @return A handle to the Application
158 * @note If the stylesheet is not specified, then the library's default stylesheet will not be overridden.
160 static Application New( int* argc, char **argv[], const std::string& stylesheet );
163 * @brief This is the constructor for applications with a name.
168 * @param[in,out] argc A pointer to the number of arguments
169 * @param[in,out] argv A pointer to the argument list
170 * @param[in] stylesheet The path to user defined theme file
171 * @param[in] windowMode A member of WINDOW_MODE
172 * @return A handle to the Application
173 * @note If the stylesheet is not specified, then the library's default stylesheet will not be overridden.
175 static Application New( int* argc, char **argv[], const std::string& stylesheet, WINDOW_MODE windowMode );
178 * @brief This is the constructor for applications.
183 * @param[in,out] argc A pointer to the number of arguments
184 * @param[in,out] argv A pointer to the argument list
185 * @param[in] stylesheet The path to user defined theme file
186 * @param[in] windowMode A member of WINDOW_MODE
187 * @param[in] positionSize A position and a size of the window
188 * @return A handle to the Application
189 * @note If the stylesheet is not specified, then the library's default stylesheet will not be overridden.
191 static Application New( int* argc, char **argv[], const std::string& stylesheet, Application::WINDOW_MODE windowMode, PositionSize positionSize );
194 * @brief Constructs an empty handle.
200 * @brief Copy Constructor.
202 * @param[in] application Handle to an object
204 Application( const Application& application );
207 * @brief Assignment operator.
209 * @param[in] application Handle to an object
210 * @return A reference to this
212 Application& operator=( const Application& application );
217 * This is non-virtual since derived Handle types must not contain data or virtual methods.
224 * @brief This starts the application.
226 * Choosing this form of main loop indicates that the default
227 * application configuration of APPLICATION_HANDLES_CONTEXT_LOSS is used. On platforms where
228 * context loss can occur, the application is responsible for tearing down and re-loading UI.
229 * The application should listen to Stage::ContextLostSignal and Stage::ContextRegainedSignal.
235 * @brief This starts the application, and allows the app to choose a different configuration.
237 * If the application plans on using the ReplaceSurface or ReplaceWindow API, then this will
238 * trigger context loss & regain.
239 * The application should listen to Stage::ContextLostSignal and Stage::ContextRegainedSignal.
241 * @param[in] configuration The context loss configuration
243 void MainLoop(Configuration::ContextLoss configuration);
246 * @brief This lowers the application to bottom without actually quitting it.
252 * @brief This quits the application. Tizen applications should use Lower to improve re-start performance unless they need to Quit completely.
258 * @brief Ensures that the function passed in is called from the main loop when it is idle.
260 * @param[in] callback The function to call
261 * @return @c true if added successfully, @c false otherwise
263 * @note Function must be called from main event thread only
265 * A callback of the following type may be used:
269 * This callback will be deleted once it is called.
271 * @note Ownership of the callback is passed onto this class.
273 bool AddIdle( CallbackBase* callback );
276 * @brief Retrieves the window used by the Application class.
278 * The application writer can use the window to change indicator and orientation
281 * @return A handle to the window
286 * @brief Replaces the current window.
288 * This will force context loss.
289 * If you plan on using this API in your application, then you should configure
290 * it to prevent discard behavior when handling the Init signal.
292 * @param[in] windowPosition The position and size parameters of the new window
293 * @param[in] name The name of the new window
295 void ReplaceWindow(PositionSize windowPosition, const std::string& name);
298 * @brief Get path application resources are stored at
301 * @return the full path of the resources
303 static std::string GetResourcePath();
306 * @brief This is used to get region information from device.
309 * @return Region information
311 std::string GetRegion() const;
314 * @brief This is used to get language information from device.
317 * @return Language information
319 std::string GetLanguage() const;
321 public: // Stereoscopy
324 * @brief Sets the viewing mode for the application.
326 * @param[in] viewMode The new viewing mode
329 void SetViewMode( ViewMode viewMode );
332 * @brief Gets the current viewing mode.
334 * @return The current viewing mode
337 ViewMode GetViewMode() const;
340 * @brief Sets the stereo base (eye separation) for Stereoscopic 3D.
342 * The stereo base is the distance in millimetres between the eyes. Typical values are
343 * between 50mm and 70mm. The default value is 65mm.
345 * @param[in] stereoBase The stereo base (eye separation) for Stereoscopic 3D
348 void SetStereoBase( float stereoBase );
351 * @brief Gets the stereo base (eye separation) for Stereoscopic 3D.
354 * @return The stereo base (eye separation) for Stereoscopic 3D
357 float GetStereoBase() const;
362 * @brief The user should connect to this signal to determine when they should initialize
365 * @return The signal to connect to
367 AppSignalType& InitSignal();
370 * @brief The user should connect to this signal to determine when they should terminate
373 * @return The signal to connect to
375 AppSignalType& TerminateSignal();
378 * @brief The user should connect to this signal if they need to perform any special
379 * activities when the application is about to be paused.
381 * @return The signal to connect to
383 AppSignalType& PauseSignal();
386 * @brief The user should connect to this signal if they need to perform any special
387 * activities when the application has resumed.
389 * @return The signal to connect to
391 AppSignalType& ResumeSignal();
394 * @brief This signal is sent when the system requires the user to reinitialize itself.
396 * @return The signal to connect to
398 AppSignalType& ResetSignal();
401 * @DEPRECATED_1_1.43 Use Window::ResizedSignal() instead.
402 * @brief This signal is emitted when the window application rendering on is resized.
404 * @return The signal to connect to
406 AppSignalType& ResizeSignal() DALI_DEPRECATED_API;
409 * @brief This signal is emitted when another application sends a launch request to the application.
411 * When the application is launched, this signal is emitted after the main loop of the application starts up.
412 * The passed parameter describes the launch request and contains the information about why the application is launched.
414 * @return The signal to connect to
416 AppControlSignalType& AppControlSignal();
419 * @brief This signal is emitted when the language is changed on the device.
421 * @return The signal to connect to
423 AppSignalType& LanguageChangedSignal();
426 * @brief This signal is emitted when the region of the device is changed.
428 * @return The signal to connect to
430 AppSignalType& RegionChangedSignal();
433 * @DEPRECATED_1_2.62 Use LowBatterySignal() instead.
434 * @brief This signal is emitted when the battery level of the device is low.
436 * @return The signal to connect to
438 AppSignalType& BatteryLowSignal() DALI_DEPRECATED_API;
441 * @DEPRECATED_1_2.62 Use LowMemorySignal() instead.
442 * @brief This signal is emitted when the memory level of the device is low.
444 * @return The signal to connect to
446 AppSignalType& MemoryLowSignal() DALI_DEPRECATED_API;
449 * @brief This signal is emitted when the battery level of the device is low.
451 * @return The signal to connect to
453 LowBatterySignalType& LowBatterySignal();
456 * @brief This signal is emitted when the memory level of the device is low.
458 * @return The signal to connect to
460 LowMemorySignalType& LowMemorySignal();
462 public: // Not intended for application developers
465 * @brief Internal constructor.
468 explicit DALI_INTERNAL Application(Internal::Adaptor::Application* application);
477 #endif // DALI_APPLICATION_H