Merge "Direct Rendering" into devel/master
[platform/core/uifw/dali-adaptor.git] / dali / internal / adaptor / windows / framework-win.cpp
1 /*\r
2  * Copyright (c) 2021 Samsung Electronics Co., Ltd.\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  * http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  *\r
16  */\r
17 \r
18 // CLASS HEADER\r
19 #include <dali/internal/adaptor/common/framework.h>\r
20 \r
21 // EXTERNAL INCLUDES\r
22 #include <dali/integration-api/debug.h>\r
23 #include <windows.h>\r
24 \r
25 // INTERNAL INCLUDES\r
26 #include <dali/internal/system/common/callback-manager.h>\r
27 #include <dali/internal/window-system/windows/platform-implement-win.h>\r
28 \r
29 namespace Dali\r
30 {\r
31 namespace Internal\r
32 {\r
33 namespace Adaptor\r
34 {\r
35 namespace\r
36 {\r
37 /// Application Status Enum\r
38 enum\r
39 {\r
40   APP_CREATE,\r
41   APP_TERMINATE,\r
42   APP_PAUSE,\r
43   APP_RESUME,\r
44   APP_RESET,\r
45   APP_LANGUAGE_CHANGE,\r
46 };\r
47 \r
48 } // Unnamed namespace\r
49 /**\r
50  * Impl to hide WindowsSystem data members\r
51  */\r
52 struct Framework::Impl\r
53 {\r
54   // Constructor\r
55 \r
56   Impl(void* data)\r
57   : mAbortCallBack(NULL),\r
58     mCallbackManager(CallbackManager::New()),\r
59     mLanguage("NOT_SUPPORTED"),\r
60     mRegion("NOT_SUPPORTED")\r
61   {\r
62   }\r
63 \r
64   ~Impl()\r
65   {\r
66     delete mAbortCallBack;\r
67 \r
68     // we're quiting the main loop so\r
69     // mCallbackManager->RemoveAllCallBacks() does not need to be called\r
70     // to delete our abort handler\r
71     delete mCallbackManager;\r
72   }\r
73 \r
74   std::string GetLanguage() const\r
75   {\r
76     return mLanguage;\r
77   }\r
78 \r
79   std::string GetRegion() const\r
80   {\r
81     return mRegion;\r
82   }\r
83 \r
84   // Static methods\r
85 \r
86   /**\r
87    * Called by AppCore on application creation.\r
88    */\r
89   static bool AppCreate(void* data)\r
90   {\r
91     return static_cast<Framework*>(data)->AppStatusHandler(APP_CREATE, NULL);\r
92   }\r
93 \r
94   /**\r
95    * Called by AppCore when the application should terminate.\r
96    */\r
97   static void AppTerminate(void* data)\r
98   {\r
99     static_cast<Framework*>(data)->AppStatusHandler(APP_TERMINATE, NULL);\r
100   }\r
101 \r
102   /**\r
103    * Called by AppCore when the application is paused.\r
104    */\r
105   static void AppPause(void* data)\r
106   {\r
107     static_cast<Framework*>(data)->AppStatusHandler(APP_PAUSE, NULL);\r
108   }\r
109 \r
110   /**\r
111    * Called by AppCore when the application is resumed.\r
112    */\r
113   static void AppResume(void* data)\r
114   {\r
115     static_cast<Framework*>(data)->AppStatusHandler(APP_RESUME, NULL);\r
116   }\r
117 \r
118   /**\r
119    * Called by AppCore when the language changes on the device.\r
120    */\r
121   static void AppLanguageChange(void* data)\r
122   {\r
123     static_cast<Framework*>(data)->AppStatusHandler(APP_LANGUAGE_CHANGE, NULL);\r
124   }\r
125 \r
126   void Run()\r
127   {\r
128     MSG nMsg = {0};\r
129 \r
130     while(GetMessage(&nMsg, 0, NULL, NULL))\r
131     {\r
132       if(WIN_CALLBACK_EVENT == nMsg.message)\r
133       {\r
134         Dali::CallbackBase* callback = (Dali::CallbackBase*)nMsg.wParam;\r
135         Dali::CallbackBase::Execute(*callback);\r
136       }\r
137 \r
138       TranslateMessage(&nMsg);\r
139       DispatchMessage(&nMsg);\r
140 \r
141       mCallbackManager->ClearIdleCallbacks();\r
142 \r
143       if(WM_CLOSE == nMsg.message)\r
144       {\r
145         break;\r
146       }\r
147     }\r
148   }\r
149 \r
150   void Quit()\r
151   {\r
152   }\r
153 \r
154   void SetCallbackBase(CallbackBase* base)\r
155   {\r
156     mAbortCallBack = base;\r
157   }\r
158 \r
159   bool ExcuteCallback()\r
160   {\r
161     if(NULL != mAbortCallBack)\r
162     {\r
163       CallbackBase::Execute(*mAbortCallBack);\r
164       return true;\r
165     }\r
166     else\r
167     {\r
168       return false;\r
169     }\r
170   }\r
171 \r
172 private:\r
173   // Undefined\r
174   Impl(const Impl& impl) = delete;\r
175 \r
176   // Undefined\r
177   Impl& operator=(const Impl& impl) = delete;\r
178 \r
179 private:\r
180   // Data\r
181   CallbackBase*    mAbortCallBack;\r
182   CallbackManager* mCallbackManager;\r
183   std::string      mLanguage;\r
184   std::string      mRegion;\r
185 };\r
186 \r
187 Framework::Framework(Framework::Observer& observer, Framework::TaskObserver& taskObserver, int* argc, char*** argv, Type type, bool useUiThread)\r
188 : mObserver(observer),\r
189   mTaskObserver(taskObserver),\r
190   mInitialised(false),\r
191   mPaused(false),\r
192   mRunning(false),\r
193   mArgc(argc),\r
194   mArgv(argv),\r
195   mBundleName(""),\r
196   mBundleId(""),\r
197   mAbortHandler(MakeCallback(this, &Framework::AbortCallback)),\r
198   mImpl(NULL)\r
199 {\r
200   InitThreads();\r
201   mImpl = new Impl(this);\r
202 }\r
203 \r
204 Framework::~Framework()\r
205 {\r
206   if(mRunning)\r
207   {\r
208     Quit();\r
209   }\r
210 \r
211   delete mImpl;\r
212 }\r
213 \r
214 void Framework::Run()\r
215 {\r
216   mRunning = true;\r
217 \r
218   Impl::AppCreate(this);\r
219   mImpl->Run();\r
220   mRunning = false;\r
221 }\r
222 \r
223 void Framework::Quit()\r
224 {\r
225   Impl::AppTerminate(this);\r
226 }\r
227 \r
228 bool Framework::IsMainLoopRunning()\r
229 {\r
230   return mRunning;\r
231 }\r
232 \r
233 void Framework::AddAbortCallback(CallbackBase* callback)\r
234 {\r
235   mImpl->SetCallbackBase(callback);\r
236 }\r
237 \r
238 std::string Framework::GetBundleName() const\r
239 {\r
240   return mBundleName;\r
241 }\r
242 \r
243 void Framework::SetBundleName(const std::string& name)\r
244 {\r
245   mBundleName = name;\r
246 }\r
247 \r
248 std::string Framework::GetBundleId() const\r
249 {\r
250   return mBundleId;\r
251 }\r
252 \r
253 std::string Framework::GetResourcePath()\r
254 {\r
255   // "DALI_APPLICATION_PACKAGE" is used by Windows specifically to get the already configured Application package path.\r
256   const char* winEnvironmentVariable = "DALI_APPLICATION_PACKAGE";\r
257   char*       value                  = getenv(winEnvironmentVariable);\r
258 \r
259   std::string resourcePath;\r
260   if(value != NULL)\r
261   {\r
262     resourcePath = value;\r
263   }\r
264 \r
265   if(resourcePath.back() != '/')\r
266   {\r
267     resourcePath += "/";\r
268   }\r
269 \r
270   return resourcePath;\r
271 }\r
272 \r
273 std::string Framework::GetDataPath()\r
274 {\r
275   std::string result = app_get_data_path();\r
276   return result;\r
277 }\r
278 \r
279 void Framework::SetBundleId(const std::string& id)\r
280 {\r
281   mBundleId = id;\r
282 }\r
283 \r
284 void Framework::AbortCallback()\r
285 {\r
286   // if an abort call back has been installed run it.\r
287   if(false == mImpl->ExcuteCallback())\r
288   {\r
289     Quit();\r
290   }\r
291 }\r
292 \r
293 bool Framework::AppStatusHandler(int type, void* bundleData)\r
294 {\r
295   switch(type)\r
296   {\r
297     case APP_CREATE:\r
298     {\r
299       mInitialised = true;\r
300 \r
301       mObserver.OnInit();\r
302       break;\r
303     }\r
304     case APP_RESET:\r
305     {\r
306       mObserver.OnReset();\r
307       break;\r
308     }\r
309     case APP_RESUME:\r
310     {\r
311       mObserver.OnResume();\r
312       break;\r
313     }\r
314     case APP_TERMINATE:\r
315     {\r
316       mObserver.OnTerminate();\r
317       break;\r
318     }\r
319     case APP_PAUSE:\r
320     {\r
321       mObserver.OnPause();\r
322       break;\r
323     }\r
324     case APP_LANGUAGE_CHANGE:\r
325     {\r
326       mObserver.OnLanguageChanged();\r
327       break;\r
328     }\r
329     default:\r
330     {\r
331       break;\r
332     }\r
333   }\r
334 \r
335   return true;\r
336 }\r
337 \r
338 void Framework::InitThreads()\r
339 {\r
340 }\r
341 \r
342 std::string Framework::GetLanguage() const\r
343 {\r
344   return mImpl->GetLanguage();\r
345 }\r
346 \r
347 std::string Framework::GetRegion() const\r
348 {\r
349   return mImpl->GetRegion();\r
350 }\r
351 \r
352 } // namespace Adaptor\r
353 \r
354 } // namespace Internal\r
355 \r
356 } // namespace Dali\r